国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java設計模式編程中的工廠方法模式和抽象工廠模式

2019-11-26 14:38:38
字體:
供稿:網(wǎng)友

工廠方法模式

動機
創(chuàng)建一個對象往往需要復雜的過程,所以不適合包含在一個復合工廠中,當有新的產(chǎn)品時,需要修改這個復合的工廠,不利于擴展。

而且,有些對象的創(chuàng)建可以需要用到復合工廠訪問不到的信息,所以,定義一個工廠接口,通過實現(xiàn)這個接口來決定實例化那個產(chǎn)品,這就是工廠方法模式,讓類的實例化推遲到子類中進行。

目的
1. 定義一個接口,讓子類決定實例化哪個產(chǎn)品。
2. 通過通用接口創(chuàng)建對象。

實現(xiàn)

201613185626410.gif (582×294)

1. 產(chǎn)品接口和具體產(chǎn)品很好理解。
2. 工廠類提供一個工廠方法,返回一個產(chǎn)品對象。但是這個工廠方法是抽象的。
3. 具體工廠類實現(xiàn)工廠方法,完成具體產(chǎn)品的創(chuàng)建。

//幾個Button類 class Button{/* ...*/} class WinButton extends Button{/* ...*/} class MacButton extends Button{/* ...*/}   //它們的工廠類 interface ButtonFactory{   abstract Button createButton(); } class WinButtonFactory implements ButtonFactory{   Button createButton(){     return new WinButton();   } } class MacButtonFactory implements ButtonFactory{   Button createButton(){     return new MacButton();   } } 

適用場景
1. 創(chuàng)建對象時有比較多重復的代碼時,可以考慮使用工廠方法模式執(zhí)行這些重復的部分。
2. 創(chuàng)建對象需要訪問某些信息,而這些信息不應該包含在工廠類,那么可以讓子類來實現(xiàn)對象的創(chuàng)建。
3. 需要集中管理對象的創(chuàng)建,保持程序的一致性時。


抽象工廠模式
定義
抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨的工廠封裝起來。在正常使用中,客戶端程序需要創(chuàng)建抽象工廠的具體實現(xiàn),然后使用抽象工廠作為接口來創(chuàng)建這一主題的具體對象。客戶端程序不需要知道(或關心)它從這些內(nèi)部的工廠方法中獲得對象的具體類型,因為客戶端程序僅使用這些對象的通用接口。抽象工廠模式將一組對象的實現(xiàn)細節(jié)與他們的一般使用分離開來。

“工廠”是創(chuàng)建產(chǎn)品(對象)的地方,其目的是將產(chǎn)品的創(chuàng)建與產(chǎn)品的使用分離。抽象工廠模式的目的,是將若干抽象產(chǎn)品的接口與不同主題產(chǎn)品的具體實現(xiàn)分離開。這樣就能在增加新的具體工廠的時候,不用修改引用抽象工廠的客戶端代碼。

使用抽象工廠模式,能夠在具體工廠變化的時候,不用修改使用工廠的客戶端代碼,甚至是在運行時。然而,使用這種模式或者相似的設計模式,可能給編寫代碼帶來不必要的復雜性和額外的工作。正確使用設計模式能夠抵消這樣的“額外工作”。

實現(xiàn)

201613185704335.png (820×411)

1. AbstractFactory - 定義創(chuàng)建抽象產(chǎn)品的接口方法。
2. ConcreteFactory - 實現(xiàn)方法創(chuàng)建具體的產(chǎn)品。
3. AbstractProduct - 聲明不同類型的產(chǎn)品的接口。
4. Product - 定義ConcreteFactory對應的具體產(chǎn)品,實現(xiàn)AbstractProduct接口。
5. Client - 使用AbstractFactory和AbstractProduct類。

abstract class AbstractProductA{   public abstract void operationA1();   public abstract void operationA2(); }  class ProductA1 extends AbstractProductA{   ProductA1(String arg){     System.out.println("Hello "+arg);   } // Implement the code here   public void operationA1() { };   public void operationA2() { }; }  class ProductA2 extends AbstractProductA{   ProductA2(String arg){     System.out.println("Hello "+arg);   } // Implement the code here   public void operationA1() { };   public void operationA2() { }; }  abstract class AbstractProductB{   //public abstract void operationB1();   //public abstract void operationB2(); }  class ProductB1 extends AbstractProductB{   ProductB1(String arg){     System.out.println("Hello "+arg);   } // Implement the code here }  class ProductB2 extends AbstractProductB{   ProductB2(String arg){     System.out.println("Hello "+arg);   } // Implement the code here }  abstract class AbstractFactory{   abstract AbstractProductA createProductA();   abstract AbstractProductB createProductB(); }  class ConcreteFactory1 extends AbstractFactory{   AbstractProductA createProductA(){     return new ProductA1("ProductA1");   }   AbstractProductB createProductB(){     return new ProductB1("ProductB1");   } }  class ConcreteFactory2 extends AbstractFactory{   AbstractProductA createProductA(){     return new ProductA2("ProductA2");   }   AbstractProductB createProductB(){     return new ProductB2("ProductB2");   } }  //Factory creator - an indirect way of instantiating the factories class FactoryMaker{   private static AbstractFactory pf=null;   static AbstractFactory getFactory(String choice){     if(choice.equals("a")){       pf=new ConcreteFactory1();     }else if(choice.equals("b")){             pf=new ConcreteFactory2();         }         return pf;   } }  // Client public class Client{   public static void main(String args[]){     AbstractFactory pf=FactoryMaker.getFactory("a");     AbstractProductA product=pf.createProductA();     //more function calls on product   } } 

FactoryMaker類使用的是簡單工廠模式,而具體工廠的實現(xiàn)用的是工廠方法模式。

適用場景
1. 一個系統(tǒng)要獨立于它的產(chǎn)品的創(chuàng)建、組合和表示時。
2. 一個系統(tǒng)要由多個產(chǎn)品系列中的一個來配置時。
3. 需要強調(diào)一系列相關的產(chǎn)品對象的設計以便進行聯(lián)合使用時。
4. 提供一個產(chǎn)品類庫,而只想顯示它們的接口而不是實現(xiàn)時。

優(yōu)點
1. 具體產(chǎn)品從客戶代碼中被分離出來
2. 容易改變產(chǎn)品的系列
3. 將一個系列的產(chǎn)品族統(tǒng)一到一起創(chuàng)建

缺點
1. 在產(chǎn)品族中擴展新的產(chǎn)品是很困難的,它需要修改抽象工廠的接口和具體工廠。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 宝山区| 银川市| 彩票| 咸丰县| 桐庐县| 北票市| 乌拉特前旗| 广宗县| 永顺县| 新平| 星座| 巴南区| 射洪县| 宜春市| 铜山县| 双江| 龙口市| 新密市| 卢龙县| 东源县| 长泰县| 周至县| 岢岚县| 神农架林区| 乌恰县| 阜宁县| 兰考县| 辰溪县| 铜川市| 娄底市| 琼海市| 石棉县| 休宁县| 汤原县| 滦南县| 韶山市| 通道| 保德县| 仙游县| 驻马店市| 永仁县|