【設計模式】簡單工廠模式(改進後的)

在前一篇【簡單工廠模式】中,使用計算器爲例作了記錄,在前文中提到了我寫的簡單工廠模式和書上講得有點不一樣:html

簡單工廠模式只是用來建立對象,而關於此對象的操做是另一回事,程序員須要手動根據工廠類建立的類對象(通常是父類對象指針,靜態類型爲父類,動態類型爲子類,多態的基礎)。 而我在工廠內部加了一個GetResult函數,這個函數用來計算結果,計算結果的依據是根據工廠類的構造函數中的輸入爲工廠類的【計算器】抽象基類指針用new 子類()去賦值,而後調用計算結果虛函數。程序員

 剛纔看了【大話設計模式】中講得策略模式和工廠模式的結合,才發現原來我寫的就是這種狀況,不過有點區別:我寫的代碼中把獲取計算器抽象基類指針動態類型的操做放在了GetResult()中,同時在這個函數中調用了計算器類的虛函數,而【大話】中把獲取父類的動態類型的操做放在了工廠類的構造函數中,在GetResult()中只是單純的調用虛函數,我也認爲這種更合理,如今改寫以下:設計模式

 

//計算結果,簡單工廠模式違背了開閉原則(對擴展開放,對修改關閉) //當有新的運算增長時,增長一個計算器抽象基類的子類的同時 //還要修改工廠類的構造函數 FactoryCaculate::FactoryCaculate(char operation, int nOpera1, int nOpera2) { m_cOperation = operation; m_nOpera1 = nOpera1; m_nOpera2 = nOpera2; //獲取計算器抽象基類動態類型的操做放在構造函數中了 switch(m_cOperation) { case '+': m_ptrCal = new CAdd(m_nOpera1, m_nOpera2); break; case '-': m_ptrCal = new CSub(m_nOpera1, m_nOpera2); break; default: m_ptrCal = NULL; break; } } int FactoryCaculate::GetResult() { if (NULL == m_ptrCal) return (-1) * ((1 << 31) - 1); return m_ptrCal->GetResult(); }

 

接口仍然不變函數

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; }
相關文章
相關標籤/搜索