以計算器類爲例,有加和減操做,提供給用戶的接口只是操做符(加 或 減),兩個操做數。設計模式
首先有一個計算器抽象基類,兩個子類,分別爲加類 和 減類,用戶經過調用類工廠來計算結果,在類廠內部經過用戶輸入的操做符來實例化不一樣的操做類,並用多態性質,將子類的指針(或引用)賦值給抽象基類的指針(或引用),而後經過抽象基類的指針(或引用)來調用計算結果的虛函數,從而得到結果。函數
NOTE:通常意義上的簡單工廠模式通常用來根據輸入來得到相應的動態類型( 父類指針 = 即去new不一樣的子類),而後賦值給父類指針(或引用),利用多態性質去調用計算結果的虛函數。 本文稍微修改了一下,類廠再也不返回動態類型,而是在內部用一個成員變量來保存該動態類型,類廠內有一個計算結果的函數(不是虛函數),而後在該函數內去得到真正的動態類型,調用相應計算器類(及其子類)的虛函數計算結果。spa
計算器類代碼以下設計
/************************************************************************ 設計模式1 簡單工廠模式 類廠負責對象的建立,以計算器爲例,類工廠提供給用戶的接口只是操做符和兩個操做數 類長內部會根據操做符去實例化不一樣的類對象,而後用計算器的基類指針調用計算結果 虛函數 ************************************************************************/ ///////////////計算 抽象基類///////////////////////////////////////////// class CCaculate { protected: int m_nOpear1; //操做數1 int m_nOpera2; //操做數2 public: virtual int GetResult() = 0; //計算結果 CCaculate(int nOpera1, int nOpera2); virtual ~CCaculate(); //虛析構函數 }; CCaculate::CCaculate(int nOpera1, int nOpera2) { m_nOpear1 = nOpera1; m_nOpera2 = nOpera2; } CCaculate::~CCaculate() { } int CCaculate::GetResult() { return 0; } ///////////////加法類//////////////////////////////////////////////////// class CAdd : public CCaculate { public: CAdd(int nOpera1, int nOpera2) : CCaculate(nOpera1, nOpera2){} virtual int GetResult(); virtual ~CAdd(); }; int CAdd::GetResult() { return m_nOpear1 + m_nOpera2; } CAdd::~CAdd() { } //////////////減法類////////////////////////////////////////////////////// class CSub : public CCaculate { public: CSub(int nOpera1, int nOPera2) : CCaculate(nOpera1, nOPera2){}; virtual int GetResult(); virtual ~CSub(); }; CSub::~CSub(){} int CSub::GetResult() { return m_nOpear1 - m_nOpera2; }
類廠代碼以下指針
///////////////簡單工廠//////////////////////////////////////////////////// class FactoryCaculate { protected: char m_cOperation; //操做符 int m_nOpera1; //操做數1 int m_nOpera2; //操做數2 CCaculate* m_ptrCal;//計算類 抽象基類指針 public: FactoryCaculate(char operation, int nOpera1, int nOpera2); int GetResult(); virtual ~FactoryCaculate(); }; FactoryCaculate::FactoryCaculate(char operation, int nOpera1, int nOpera2) { m_cOperation = operation; m_nOpera1 = nOpera1; m_nOpera2 = nOpera2; m_ptrCal = NULL; } //計算結果,簡單工廠模式違背了開閉原則(對擴展開放,對修改關閉) //當有新的運算增長時,增長一個計算器抽象基類的子類的同時 //還要修改GetResult()函數的switch case結構 int FactoryCaculate::GetResult() { int nResult = 0; if (NULL != m_ptrCal) delete m_ptrCal; switch(m_cOperation) { case '+': m_ptrCal = new CAdd(m_nOpera1, m_nOpera2); if(NULL != m_ptrCal) {nResult = m_ptrCal->GetResult();} break; case '-': m_ptrCal = new CSub(m_nOpera1, m_nOpera2); if(NULL != m_ptrCal) {nResult = m_ptrCal->GetResult();} break; default: break; } return nResult; } FactoryCaculate::~FactoryCaculate() { if (NULL != m_ptrCal) delete m_ptrCal; m_ptrCal = NULL; }
main函數code
int _tmain(int argc, _TCHAR* argv[]) { FactoryCaculate factCaculate1('+', 100, 200); cout << "Result is "<<factCaculate1.GetResult()<<endl; FactoryCaculate factCaculate2('-', 100, 1000); cout << "Result is "<<factCaculate2.GetResult()<<endl; FactoryCaculate factCaculate3('*', 100, 10); cout << "Result is "<<factCaculate3.GetResult()<<endl; return 0; }
運行結果對象
簡單工廠有個缺點:當有新的操做類(乘除)時,除了新增長CCaculate抽象基類的子類之外,還須要修改類廠的代碼,修改switch...case代碼,這違反了【開閉原則】即對擴展開放,對修改關閉。blog
本文中的修工廠的修改不知道是好仍是很差呢?接口