并且設計模式中指出,類模式處理類和子類子間的關系,這些關系通過繼承建立,是靜態的,在編譯時刻便確定下來。對象模式則處理對象之間的關系,是動態的,運行時刻是可以變化的,更具動態性。
工廠方法由于屬于類型創建模式,因此它的創建工作由子類完成,而不是使用對象進行創建,并且在《設計模式》中工廠方法的動機一節有一個示例,它的類大致如下:
//抽象產品,可以是接口或者抽象類 public abstract class document { public void open(){ ............... ............... } public void close(){ ............... ............... } public void save(); } //具體的產品, public class Mydocument extends document{ public void open(){ ............. .............. } ............... } //模板方法,在方法中使用了工廠方法 |
具體的工廠實現由子類來實現工廠方法:
public class myappliaction extends appliaction { public document createDocument(){ return new Mydocument(); } } |
大家可以看出,這其實使用template method模式,抽象方法聲明創建對象,而模板方法完成業務邏輯,她使用抽象創建方法,由繼承來獲得產品,而不是使用對象來創建對象的。
并且大家仔細看<設計模式>71頁的結構圖,里的creator里有兩個方法,其中一個使用factorymethod方法,另外一個就是普通的方法,anOperation它調用了工廠方法,product=factorymethod()來獲得產品對象。
現在問題就出現在這里,而另外一本書閻宏的《java與模式》的167地結構圖中卻沒有把這點作出標記,并且提供的示例,也不像最初<設計模式>中的工廠方法的例子,
他的示例如下:
//抽象工廠,而這里卻沒有方法使用工廠方法: public class ConcreteCreator1 implements Creator 而客戶端卻使用; |
我感覺這樣示例有問題,或者不妥,或者不能表達原意。
在客戶端,他的對象創建使用了
prod1 = creator1.factory();
這樣顯然使用對象creator1來創建對象的,而不是使用繼承,類模式來完成創建的。這與工廠方法的原意,類模式,把創建工廠延遲到子類實現,等有沖突。
這樣想對象創建模式。