工廠方法模式設計模式
/************************************************************************ 設計模式 工廠方法模式 在簡單工廠裏,工廠類的職責是根據不一樣的輸入去實例化不一樣的類對象(實例化不一樣 類對象的代碼是在一個工廠類中),做爲客戶端來講,所要作的就是根據須要來爲 簡單工廠傳遞不一樣的參數,當有新的需求增長時,須要再增長一個功能類的同時, 須要去修改簡單工廠總根據輸入實例化不一樣類的代碼,在以前說過,這違反了開閉原則, 就是多當要擴展了時必需要修改代碼。 在工廠類中通常是在其構造函數中實例化不一樣 的功能類。 在工廠方式模式中,兩次用到了多態機制。 工廠方法模式中,有一個工廠類的(抽象)基類,工廠基類的每一個子類的做用是實例化 不一樣的功能類(對象), 一個功能類對應一個工廠子類,一一對應,每一個工廠類須要 繼承重寫的(虛)方法用來建立不一樣的功能類對象。 這一點也不一樣於簡單工廠模式中的 在其構造函數中實例化不一樣類對象。 客戶端根據須要去實例化不一樣的工廠子類,其返回值賦給工廠(抽象)父類對象(多態1), 而後該工廠(抽象)父類對象去調用建立(實例化)功能類對象的方法,將其返回值賦值給 功能類(抽象)父類對象(多態2),而後用該功能類(抽象)父類對象去調用相應的(虛)函數。 從而完成不一樣的操做。 ************************************************************************/
本例以女媧娘娘造人爲例,這個創意是從別處看來的,沒體具體看人家的代碼,以爲這個例子的創意很好,以爲頗有意思,因而就拿過來一用。函數
前面所述,一個工廠子類對應一個功能子類,其功能僅僅是用來實例化相應的功能子類。spa
這裏的工廠父類是INvWaFactory,女媧娘娘工廠,由於功能類的抽象基類是IHuman(人類),人類有三個子類(白人、黑人、黃人),所以女媧娘娘工廠父類也有三個工廠子類,其做用是分別實例化白人類、黑人類、黃人類。設計
在女媧娘娘工廠類繼承體系中,有一個虛函數CreateInstance,這個虛函數用來實例化不一樣的人類子類,而且返回人類抽象基類的指針。指針
兩次多態:①根據須要去實例化不一樣的工廠子類,將該工廠子類指針賦值給女媧娘娘工廠抽象基類指針,而後用此指針去調用相應的CreateInstance虛函數。code
②將CreateInstance虛函數的返回值賦值給IHuman人類類抽象基類指針,用此指針去調用IHuman人類繼承體系中的ShowSkin虛函數。對象
//人類 類,抽象基類 class IHuman { public: IHuman(); virtual ~IHuman(); virtual void ShowSkin() const = 0; //顯示膚色 }; IHuman::IHuman(){} IHuman::~IHuman(){} void IHuman::ShowSkin() const {} ////////////////////////////////////////////////////////////////////////// //白人類 class White : public IHuman { public: White(); virtual ~White(); virtual void ShowSkin() const; }; White::White(){} White::~White(){} void White::ShowSkin() const { cout << "我是白人,個人膚色是白色!\r\n"; } ////////////////////////////////////////////////////////////////////////// //黑人類 class Black : public IHuman { public: Black(); virtual ~Black(); virtual void ShowSkin() const; }; Black::Black(){} Black::~Black(){} void Black::ShowSkin() const { cout << "我是黑人,個人膚色是黑色\r\n"; } ////////////////////////////////////////////////////////////////////////// //黃人類 class Yellow : public IHuman { public: Yellow(); virtual ~Yellow(); virtual void ShowSkin() const; }; Yellow::Yellow(){} Yellow::~Yellow(){} void Yellow::ShowSkin() const { cout << "我是黃種人,個人膚色是黃色\r\n"; } //////////////////////////////////////////////////////////////////////////
下面是工廠類繼承結構blog
class INvWaFactory //女媧工廠抽象基類 { public: INvWaFactory(); virtual ~INvWaFactory(); virtual IHuman* CreateInstance() = 0; //建立不一樣的功能子類 protected: IHuman* m_ptrHuman; }; INvWaFactory::INvWaFactory() { m_ptrHuman = NULL;} INvWaFactory::~INvWaFactory(){ } IHuman* INvWaFactory::CreateInstance() {return NULL;} ////////////////////////////////////////////////////////////////////////// //造白人類 class CMakeWhite : public INvWaFactory { public: CMakeWhite(); virtual ~CMakeWhite(); virtual IHuman* CreateInstance() ; }; CMakeWhite::CMakeWhite(){} CMakeWhite::~CMakeWhite(){delete m_ptrHuman;} IHuman* CMakeWhite::CreateInstance() { return (m_ptrHuman = new White()); } //////////////////////////////////////////////////////////////////////////// //造黑人類 class CMakeBlack : public INvWaFactory { public: CMakeBlack(); virtual ~CMakeBlack(); virtual IHuman* CreateInstance(); }; CMakeBlack::CMakeBlack(){} CMakeBlack::~CMakeBlack(){delete m_ptrHuman;} IHuman* CMakeBlack::CreateInstance() { return (m_ptrHuman = new Black()); } ////////////////////////////////////////////////////////////////////////// //造黃種人 class CMakeYellow : public INvWaFactory { public: CMakeYellow(); virtual ~CMakeYellow(); virtual IHuman* CreateInstance(); }; CMakeYellow::CMakeYellow(){} CMakeYellow::~CMakeYellow(){delete m_ptrHuman;} IHuman* CMakeYellow::CreateInstance() { return (m_ptrHuman = new Yellow()); }
main函數及執行結果繼承
int _tmain(int argc, _TCHAR* argv[]) { INvWaFactory* pNvwaFactor = new CMakeWhite(); IHuman* pHuman = pNvwaFactor->CreateInstance(); pHuman->ShowSkin(); delete pNvwaFactor; cout<<endl; pNvwaFactor = new CMakeBlack(); pHuman = pNvwaFactor->CreateInstance(); pHuman->ShowSkin(); delete pNvwaFactor; cout<<endl; pNvwaFactor = new CMakeYellow(); pHuman = pNvwaFactor->CreateInstance(); pHuman->ShowSkin(); delete pNvwaFactor; cout<<endl<<endl; return 0; }