我的在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7843763java
如下是讀《設計模式——可複用面向對象軟件的基礎》的讀書筆記。設計模式
FACTORY METHOD工廠方法ide
一、 意圖.net
定義一個用於建立對象的接口,讓子類決定實例化哪個類。Factory Method使一個類的實例化延遲到其子類。設計
二、 別名代理
虛構造器(Virtual Constructor)code
三、 適用性對象
在下面狀況下可使用Factory Method模式:blog
四、 結構接口
五、 參與者
Product
——定義工廠方法所建立的對象的接口。
ConcreteProduct
——實現Product接口。
Creator
——聲明工廠方法,該方法返回一個Product類型的對象。Creator也能夠定義一個工廠方法的缺省實現,它返回一個缺省的ConcreteProduct對象。
——能夠調用工廠方法以建立一個Product對象。
ConcreteCreator
——重定義工廠方法以返回一個ConcreteProduct實例。
六、 協做
Creator依賴於它的子類來定義工廠方法,因此它返回一個適當的ConcreteProduct實例。
七、 效果
工廠方法再也不將與特定應用有關的類綁定到你的代碼中。代碼僅處理Product接口;所以它能夠與用戶定義的任何ConcreteProduct類一塊兒使用。
工 廠方法的一個潛在缺點在於客戶可能僅僅爲了建立一個特定的ConcreteProduct對象,就不得不建立Creator的子類。當Creator子類 沒必要需時,客戶如今必然要處理類演化的其餘方面;可是當客戶不管如何須須建立Creator的子類時,建立子類也是可行的。
下面是FactoryMethod貌似的另外兩種效果:
1)爲子類提供掛鉤(hook) 用工廠方法在一個類的內部建立對象一般比直接建立對象更靈活。Factory Method給子類一個掛鉤以提供對象的擴展版本。
2)鏈接平行的類層次 當一個類將它的一些職責委託給一個獨立的類的時候,就產生了平行類的層次。工廠方法並不每每只是被Creator調用,客戶能夠找到一些有用的工廠方法。
八、 實現
當應用Factory Method模式時要考慮下面問題:
1) 主要有兩種不一樣的狀況 Factory Method模式主要有兩種不一樣的狀況:A第一種狀況是,Creator類是一個抽象類而且不提供它所聲明的工廠方法的實現。B第二種狀況是,Creator是一個具體的類並且爲工廠方法提供一個缺省的實現。
第一種狀況須要子類來定義實現,由於沒有合理的缺省實現。它避免了不起不實例化不可預見類的問題。
第二種狀況中,具體的Creator主要由於靈活性才使用工廠方法。它所遵循的準則是,「用一個獨立的操做建立對象,這樣子類才能重定義它們的建立方式。」這條準則保證了子類的設計者可以在必要的時候改變父類所實例化的對象的類。
2) 參數化工廠方法 該模式的另外一種狀況使得工廠方法能夠建立多種產品。工廠方法採用一個標識要被建立的對象種類的參數。工廠方法建立的全部對象將共享Product接口。
九、 示例
package com.examples.pattern.factoryMethod; /** * 工廠方法所建立的對象的接口 */ public interface Product { /** * 定義的一些方法 */ public void operate(); }ConcreteProduct
package com.examples.pattern.factoryMethod; /** * 具體的Product對象 */ public class ConcreteProduct implements Product { @Override public void operate() { //具體實現... System.out.println("operate ...."); } }Creator
package com.examples.pattern.factoryMethod; /** * 建立器,聲明工廠方法 */ public abstract class Creator { /** * 建立Product的工廠方法 * @return Product對象 */ protected abstract Product factoryMethod(); /** * 示例方法,完成一些操做... */ public void someOperation(){ //一般在這些方法中須要調用工廠方法來得到Product對象。 //得到是其子類定義的對象... Product product = factoryMethod(); product.operate(); //一些操做... } }
package com.examples.pattern.factoryMethod; /** * 具體的建立器實現對象 */ public class ConcreteCreater extends Creator { @Override protected Product factoryMethod() { //重定義工廠方法,返回一個具體的Product實例。 return new ConcreteProduct(); } }Client
package com.examples.pattern.factoryMethod; public class Client { public static void main(String[] args) { Creator creator = new ConcreteCreater(); creator.someOperation(); } }
十、 相關模式
Abstract Factory常常用工廠方法來實現。
工廠方法一般在Template Method中被調用。
Prototypes不須要建立Creator子類。可是,他們一般要求一個針對Product類的Initialize操做。Creator使用Initialize來初始化對象。而Factory Method不須要這樣的操做。