工廠方法模式不同于簡單工廠模式的地方在于工廠方法模式把對象的創建過程放到里子類里。這樣工廠父對象和產品父對象一樣,可以是抽象類或者接口,只定義相應的規范或操作,不涉及具體的創建或實現細節。
其類圖如下:
實例代碼為:
#pragma once class IProduct { public: IProduct(void); virtual ~IProduct(void); }; #pragma once #include "iproduct.h" class IPad : public IProduct { public: IPad(void); ~IPad(void); }; #pragma once #include "iproduct.h" class IPhone : public IProduct { public: IPhone(void); ~IPhone(void); }; #pragma once #include"IProduct.h" class IFactory { public: IFactory(void); virtual ~IFactory(void); virtual IProduct* getProduct(); }; #pragma once #include "ifactory.h" class IPadFactory : public IFactory { public: IPadFactory(void); ~IPadFactory(void); virtual IProduct* getProduct(); }; #pragma once #include "ifactory.h" class IPhoneFactory : public IFactory { public: IPhoneFactory(void); ~IPhoneFactory(void); virtual IProduct* getProduct(); };
關鍵的實現:
#include "StdAfx.h" #include "IPadFactory.h" #include"IPad.h" IPadFactory::IPadFactory(void) { } IPadFactory::~IPadFactory(void) { } IProduct* IPadFactory::getProduct() { return new IPad(); } #include "StdAfx.h" #include "IPhoneFactory.h" #include"IPhone.h" IPhoneFactory::IPhoneFactory(void) { } IPhoneFactory::~IPhoneFactory(void) { } IProduct* IPhoneFactory::getProduct() { return new IPhone(); }
調用方式:
#include "stdafx.h" #include"IFactory.h" #include"IPadFactory.h" #include"IPhoneFactory.h" #include"IProduct.h" int _tmain(int argc, _TCHAR* argv[]) { IFactory *fac = new IPadFactory(); IProduct *pro = fac->getProduct(); fac = new IPhoneFactory(); pro = fac->getProduct(); return 0; }
應用場景:
1..net里面的數據庫連接對象就是產生數據命令對象的工廠。每種數據庫的connection對象里(繼承自IDbConnection)都有對自己createCommand(定義在IDbCommand里)的實現。
2..net里面的迭代器,IEnumerable定義了迭代器的接口,即工廠方法,每一個繼承自IEnumerable的類都要實現GetEnumerator。可以參看ArrayList,String的GetEnumerator方法。他們都繼承自IEnumerable。
對比簡單工廠模式與工廠方法模式:
1. 結構復雜度
從這個角度比較,顯然簡單工廠模式要占優。簡單工廠模式只需一個工廠類,而工廠方法模式的工廠類隨著產品類個數增加而增加,這無疑會使類的個數越來越多,從而增加了結構的復雜程度。
2.代碼復雜度
代碼復雜度和結構復雜度是一對矛盾,既然簡單工廠模式在結構方面相對簡潔,那么它在代碼方面肯定是比工廠方法模式復雜的了。簡單工廠模式的工廠類隨著產品類的增加需要增加很多方法(或代碼),而工廠方法模式每個具體工廠類只完成單一任務,代碼簡潔。
3.客戶端編程難度
工廠方法模式雖然在工廠類結構中引入了接口從而滿足了OCP,但是在客戶端編碼中需要對工廠類進行實例化。而簡單工廠模式的工廠類是個靜態類,在客戶端無需實例化,這無疑是個吸引人的優點。
4.管理上的難度
這是個關鍵的問題。
我 們先談擴展。眾所周知,工廠方法模式完全滿足OCP,即它有非常良好的擴展性。那是否就說明了簡單工廠模式就沒有擴展性呢?答案是否定的。簡單工廠模式同 樣具備良好的擴展性——擴展的時候僅需要修改少量的代碼(修改工廠類的代碼)就可以滿足擴展性的要求了。盡管這沒有完全滿足OCP,但筆者認為不需要太拘 泥于設計理論。
然后我們從維護性的角度分析下。假如某個具體產品類需要進行一定的修改,很可能需要修改對應的工廠類。當同時 需要修改多個產品類的時候,對工廠類的修改會變得相當麻煩(對號入座已經是個問題了)。反而簡單工廠沒有這些麻煩,當多個產品類需要修改是,簡單工廠模式 仍然僅僅需要修改唯一的工廠類(無論怎樣都能改到滿足要求吧?大不了把這個類重寫)。
由以上的分析,筆者認為簡單工廠模式更好用更方便些。當然這只是筆者的個人看法而已,畢竟公認的,工廠方法模式比簡單工廠模式更“先進”。但有時過于先進的東西未必適合自己,這個見仁見智吧。