???? ?工廠方法模式是一種更靈活的模式,它擴(kuò)展了子類實例化的思想,即不再由單個工廠類決定到底應(yīng)該實例化哪個子類。而超類則會將這一決定推遲到每個子類中完成。這種模式實際上不存在直接選擇某個子類的決策點。使用這種模式編寫的程序定義了一個抽象類(或者接口),雖然負(fù)責(zé)創(chuàng)建對象,但是應(yīng)該創(chuàng)建哪個對象將由各個子類來決定。
?工廠方法模式類圖如下
?????? 工廠方法類圖
???????????????????????????????????????????????????????? (圖片來源于參考文獻(xiàn)1)
從上圖可以看出,工廠方法模式涉及到以下的角色

抽象工廠接口(Creator)
?
???? 擔(dān)任這個角色的是工廠方法的核心,它是與應(yīng)用程序無關(guān),創(chuàng)建的工廠類必須實現(xiàn)該接口。
實工廠類 (Conrete Creator)
???? 擔(dān)任這個角色的是與應(yīng)用程序緊密相關(guān)的,直接在程序的調(diào)用下創(chuàng)建具體的產(chǎn)品。
產(chǎn)品 (Product)
???? 擔(dān)任這個角色的是工廠方法模式所創(chuàng)建對象的父類,或者是必須實現(xiàn)的接口。
實產(chǎn)品 (Concrete Product)
?? 擔(dān)任這個角色的是工廠方法模式所創(chuàng)建對象所屬的類。

?? ?工廠方法模式和簡單工廠模式在定義上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類,而不像簡單工廠模式, 把核心放在一個實類上。工廠方法模式可以允許很多實的工廠類從抽象工廠類繼承下來, 從而可以在實際上成為多個簡單工廠模式的綜合,從而推廣了簡單工廠模式。
??? 反過來講,簡單工廠模式是由工廠方法模式退化而來。設(shè)想如果我們非常確定一個系統(tǒng)只需要一個實的工廠類, 那么就不妨把抽象工廠類合并到實的工廠類中去。而這樣一來,我們就退化到簡單工廠模式了。
?? 工廠方法模式又叫多形性工廠模式,顯然是因為實工廠類都有共同的接口,或者都有共同的抽象父類。
?? 下面看看一個簡單的例子:

?? //代碼清單1 ?抽象工廠類(父類)
??? abstract public class?Factory
?? {
?????? public?abstract Product factory(String name)throws BadProductException;
?? }?
??
?? //代碼清單2? 工廠類A(子類)
?? public class FactoryA
?? {
?????????Product factory(String name)throws BadProductException
???????? {
????????????????if(name.equals(A!))
??????????????? {
???????????????????? return new ProductA1();
????????????????}else if(name.equals("A2"))
??????????????? {
???????????????????? return new ProductA2();
??????????????? }else
???????????????????throw new BadProductException(name);
???????? }
?? }

? //代碼清單3? 工廠類B(子類)
?? public class FactoryB
?? {
?????????Product factory(String name)throws BadProductException
???????? {
????????????????if(name.equals(B1))
??????????????? {
???????????????????? return new ProductB1();
????????????????}else if(name.equals("B2"))
??????????????? {
???????????????????? return new ProductB2();
??????????????? }else
???????????????????throw new BadProductException(name);
???????? }
?? }
??? //代碼清單4? 產(chǎn)品類接口
??? public?interface Product
?? {
?????????void?desc();?? //產(chǎn)品描述
??? }

??? //代碼清單5 實產(chǎn)品類(A2,B1, B2與此類似)
?? public ProductA1 implements?Product
? {
?????? public void desc()
????? {
?????????? System.out.println("this is product A1");
????? }
?? }
???//代碼清單6 異常類
? public class BadProductException extends Exception
? {
??????? public BadProductException(String msg)
???????{
???????????? super(msg);
???????}
??}

工廠方法的適用環(huán)境
??? 1.類玩法預(yù)計出必須創(chuàng)建哪個類的對象。
??? 2.類要使用其子類指定所要創(chuàng)建的對象。
??? 3.對于將創(chuàng)建哪個類,希望將有關(guān)信息局部化。

工廠模式的幾種不同形式
??? 1.基類是抽象類,并且這種模式必須返回一個完全可工作的類。
??? 2.基類包含默認(rèn)方法,并且只有當(dāng)默認(rèn)的方法不夠用時,才需要派生子類。
??? 3.傳遞給工廠的參數(shù)將通知要返回哪些類類型。在這種情況下,所有的類必須有相同的方法名,當(dāng)然每個方法完成不同的操作。

參考文獻(xiàn):??? 1.http://www.yesky.com/20011128/207301.shtml
???????????????????2.<<java設(shè)計模式>>
???