c++工廠模式(Factory method)
1.工廠的介面,相當於造人工廠總部。
class IHumanFactory { public: IHumanFactory(void) { } ~IHumanFactory(void) { } virtual IHuman* CreateHuman() = 0; };
2.造人各個的部門
class WhiteHumanFactory: public IHumanFactory { public: WhiteHumanFactory(void) { } ~WhiteHumanFactory(void) { } IHuman *CreateHuman() { return new WhiteHuman(); } }; class YellowHumanFactory: public IHumanFactory { public: YellowHumanFactory(void) { } ~YellowHumanFactory(void) { } IHuman *CreateHuman() { return new YellowHuman(); } }; classBlackHumanFactory: public IHumanFactory { public: BlackHumanFactory(void) { } ~BlackHumanFactory(void) { } IHuman *CreateHuman() { return new BlackHuman(); } };
3.各種人的特徵。
class IHuman { public: IHuman(void) { } ~IHuman() { } virtualvoid Laugh() = 0; virtual void Cry() = 0; virtual void Talk() = 0; }; class WhiteHuman : public IHuman { public: WhiteHuman(void) { } ~WhiteHuman(void) { } void Laugh() { std::cout << "白種人笑!" << std::endl; } void Cry() { std::cout << "白種人哭!" <<std::endl; } void Talk() { std::cout << "白種人說話!" <<std::endl; } }; class YellowHuman : public IHuman { public: YellowHuman(void) { } ~YellowHuman(void) { } void Laugh() { std::cout << "黃種人笑!" << std::endl; } void Cry() { std::cout << "黃種人哭!" <<std::endl; } void Talk() { std::cout << "黃種人說話!" <<std::endl; } }; class BlackHuman : public IHuman { public: BlackHuman(void) { } ~BlackHuman(void) { } void Laugh() { std::cout << "黑種人笑!" << std::endl; } void Cry() { std::cout << "黑種人哭!" <<std::endl; } void Talk() { std::cout << "黑種人說話!" <<std::endl; } };
4.主函式
int main() { std::cout << "#1.製造黃種人"<<std::endl; IHumanFactory *pHumanFactory = new YellowHumanFactory(); IHuman * pHuman = pHumanFactory->CreateHuman(); pHuman->Cry(); pHuman->Laugh(); pHuman->Talk(); delete pHuman; delete pHumanFactory; std::cout << "#1.製造白種人"<<std::endl; IHumanFactory *pHumanFactory2 = new WhiteHumanFactory(); IHuman * pHuman2 = pHumanFactory->CreateHuman(); pHuman->Cry(); pHuman->Laugh(); pHuman->Talk(); delete pHuman2; delete pHumanFactory2; std::cout << "#1.製造黑種人"<<std::endl; IHumanFactory *pHumanFactory3 = new BlackHumanFactory(); IHuman * pHuman3 = pHumanFactory->CreateHuman(); pHuman->Cry(); pHuman->Laugh(); pHuman->Talk(); delete pHuman3; delete pHumanFactory3; getchar(); return 0; }
輸出結果:
#1.製造黃種人 黃種人哭! 黃種人笑! 黃種人說話! #1.製造白種人 白種人哭! 白種人笑! 白種人說話! #1.製造黑種人 黑種人哭! 黑種人笑! 黑種人說話!
工廠模式的好處:
工廠模式就相當於建立例項物件的new,我們經常要根據類Class生成例項物件,如A a=new A(). 工廠模式也是用來建立例項物件的,可能多做一些工作,但會給你係統帶來更大的可擴充套件性和儘量少的修改量。
類Sample為例,要建立Sample的例項物件:
Sample sample=new Sample();
可是,實際情況是,通常我們都要在建立sample例項時做點初始化的工作,比如賦值 查詢資料庫等
首先,我們想到的是,可以使用Sample的建構函式,這樣生成例項就寫成:
Sample sample=new Sample(引數);
但是,如果建立sample例項時所做的初始化工作不是象賦值這樣簡單的事,可能是很長一段程式碼,如果也寫入建構函式中,那你的程式碼很難看了
初 始化工作如果是很長一段程式碼,說明要做的工作很多,將很多工作裝入一個方法中,相當於將很多雞蛋放在一個籃子裡,是很危險的,這也是有背於Java面向對 象的原則,面向物件的封裝(Encapsulation)和分派(Delegation)告訴我們,儘量將長的程式碼分派“切割”成每段,將每段再“封裝” 起來(減少段和段之間偶合聯絡性),這樣,就會將風險分散,以後如果需要修改,只要更改每段,不會再發生牽一動百的事情。
我們需要將建立例項的工作與使用例項的工作分開, 也就是說,讓建立例項所需要的大量初始化工作從Sample的建構函式中分離出去。
你想如果有多個類似的類,我們就需要例項化出來多個類。這樣程式碼管理起來就太複雜了。
這個時候你就可以採用工廠方法來封裝這個問題。
不能再用上面簡單new Sample(引數)。還有,如果Sample有個繼承如MySample, 按照面向介面程式設計,我們需要將Sample抽象成一個介面.現在Sample是介面,有兩個子類MySample 和HisSample
Sample mysample=new MySample();
Sample hissample=new HisSample();
採用工廠封裝:
public class Factory{
public static Sample creator(int which){
//getClass 產生Sample 一般可使用動態類裝載裝入類。
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
}
那麼在你的程式中,如果要例項化Sample時.就使用
Sample sampleA=Factory.creator(1);
舉 個更實際的例子,比如你寫了個應用,裡面用到了資料庫的封裝,你的應用可以今後需要在不同的資料庫環境下執行,可能是oracle,db2,sql server等,那麼連線資料庫的程式碼是不一樣的,你用傳統的方法,就不得不進行程式碼修改來適應不同的環境,非常麻煩,但是如果你採用工廠類的話,將各種 可能的資料庫連線全部實現在工廠類裡面,通過你配置檔案的修改來達到連線的是不同的資料庫,那麼你今後做遷移的時候程式碼就不用進行修改了。
我通常都是用xml的配置檔案配置許多型別的資料庫連線,非常的方便。PS:工廠模式在這方面的使用較多。