工廠方法模式
- 定義
定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類,工廠方法使一個類的實例化延遲到其子類
- 要點
- 工廠接口: 是工廠方法模式的核心,與調(diào)用者直接交互并向調(diào)用者提供產(chǎn)品
- 工廠實現(xiàn): 工廠實現(xiàn)決定如何實例化產(chǎn)品,是實現(xiàn)擴展的途徑
- 產(chǎn)品接口: 產(chǎn)品接口的主要目的是定義產(chǎn)品的規(guī)范,所有的產(chǎn)品實現(xiàn)必須遵循產(chǎn)品接口定義的規(guī)范
- 產(chǎn)品實現(xiàn): 實現(xiàn)產(chǎn)品接口的具體類,決定了產(chǎn)品在客戶端中的具體行為
- 在工廠方法模式中,抽象產(chǎn)品類Product負責(zé)定義產(chǎn)品的共性,實現(xiàn)對事物最抽象的定義;IFactory為抽象創(chuàng)建類,具體如何創(chuàng)建產(chǎn)品類是由具體的實現(xiàn)工廠類完成
- 實現(xiàn)方式
- 僅采用一個工廠類,沒有抽象類(稱為簡單工廠)
- 包含一個抽象類,或多個實現(xiàn)類
- 工廠類中,一個方法實例化一個產(chǎn)品(常采用靜態(tài)方法,故又稱為靜態(tài)工廠方法)
- 示例
- 僅采用一個工廠類,沒有抽象類(簡單工廠)
/** * 核心工廠類 其中key的獲取方法可以有多種方式:如反射,泛型,讀取配置文件等 */ public class ProductFactory { public static Product createProduct(String key){ Product baseProduct = null; if("ONE".equals(key)){ baseProduct = new ProductOne(); }else if("TWO".equals(key)){ baseProduct = new ProductTwo(); } return baseProduct; } }
- 采用多個方法對產(chǎn)品進行實例化(又稱為多個工廠方法)
/** * 核心工廠類 采用一個方法對應(yīng)一個產(chǎn)品的方式創(chuàng)建 */ public class ProductFactory implements IFactory{ public Product createProduct1(){ return new ProductOne(); } public Product createProduct2(){ return new ProductTwo(); } }
- 靜態(tài)工廠方法,在
多個工廠方法
的方法變成靜態(tài)方法,不需要創(chuàng)建類,直接調(diào)用即可 - 以上這些方法都可以進行組合使用,最終符合工廠方法的定義即可
- 一個抽象工廠,多個工廠實現(xiàn)類
- 特點
- 是一種創(chuàng)建類模式,在任何需要生產(chǎn)復(fù)雜對象的地方,都可以使用工廠方法
- 良好的封裝性,代碼結(jié)構(gòu)清晰
- 屏蔽產(chǎn)品類,調(diào)用者只需要關(guān)心產(chǎn)品的接口
- 復(fù)雜對象比較適合工廠模式,簡單對象有時僅需要new創(chuàng)建就可以了
- 解耦模式, 迪米特法則在工廠模式中表現(xiàn)的尤為明顯,可以降低對象間的耦合度
- 工廠模式依賴抽象架構(gòu),它把實例化任務(wù)交給實現(xiàn)類,擴展性較好
- 引用