C++設計模式之工廠方法模式詳解(對比簡單工廠)
阿新 • • 發佈:2020-12-13
前面的文章詳細介紹了單例模式和簡單工廠模式,有需要的可以點選連結去看看。之前說到,簡單工廠模式有一個最大的弊端就是它違背了開放封閉原則,因為如果需要新增功能,則需要工廠類的內部,這違背了對修改關閉的設計原則。為了解決這個問題,工廠方法模式就誕生了。
工廠方法:定義了一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。通俗一點講工廠方法和簡單工廠的區別在於:簡單工廠只有一個工廠類,且其中包含了所有可能的操作,根據傳入引數的不同返回不同的物件,而工廠方法中,除了有一個工廠類(基類)之外,每個功能還存在一個派生類,客戶可以根據自己的需求去例項化不同的物件。
#include<iostream> using namespace std; //工廠方法模式:定一個一個建立物件的介面,讓子類決定例項化那一個類。工廠方法使一個類的例項化延遲到子類 //如果增加新的功能,則只需要增加該操作類和該操作的工廠類,這樣全程就對修改關閉了 //操作類 class Operation { private: int numberA; int numberB;//兩個私有資料 public: //四個公有方法來設定和獲取資料 int getNumberA() { return numberA; } void setNumberA(int value) { numberA = value; } int getNumberB() { return numberB; } void setNumberB(int value) { numberB = value; } virtual int getresult() = 0;//純虛擬函式 }; //加法類 class Add :public Operation { public: int getresult() { return getNumberA() + getNumberB(); } }; //減法類 class Sub :public Operation { public: int getresult() { return getNumberA() - getNumberB(); } }; //除法類 class Div :public Operation { public: int getresult() { if (getNumberB() == 0) { cout << "除數不能為0" << endl; return 0; } return getNumberA() / getNumberB(); } }; //乘法類 class Prod :public Operation { public: int getresult() { return getNumberA() * getNumberB(); } }; //工廠基類(簡單工廠只有這一個工廠類,例項化也在該類中) class Factoryoper { public: virtual Operation* createOperation() = 0;//純虛擬函式 }; //工廠方法是需要哪個功能就例項化哪個物件,讓客戶去決定,派生出具體的功能類 //加法工廠 class addFactory :public Factoryoper { public: Operation* createOperation() { return new Add(); } }; //減法工廠 class subFactory :public Factoryoper { public: Operation* createOperation() { return new Sub(); } }; //除法工廠 class divFactory :public Factoryoper { public: Operation* createOperation() { return new Div(); } }; //乘法工廠 class prodFactory :public Factoryoper { public: Operation* createOperation() { return new Prod(); } }; int main() { Factoryoper* operFactory1 = new addFactory();//加法工廠 Operation* oper1 = operFactory1->createOperation();//加法例項 oper1->setNumberA(10); oper1->setNumberB(20); int res = oper1->getresult();//得到結果 cout << res << endl; Factoryoper* operFactory2 = new subFactory(); Operation* oper2 = operFactory2->createOperation(); oper2->setNumberA(10); oper2->setNumberB(20); cout << oper2->getresult()<< endl; Factoryoper* operFactory3 = new divFactory(); Operation* oper3 = operFactory3->createOperation(); oper3->setNumberA(60); oper3->setNumberB(3); cout << oper3->getresult() << endl; Factoryoper* operFactory4 = new prodFactory(); Operation* oper4 = operFactory4->createOperation(); oper4->setNumberA(60); oper4->setNumberB(3); cout << oper4->getresult() << endl; system("pause"); return 0; }
程式碼中關鍵地方都註釋了,相信大家也能看懂,歡迎交流討論哈。