簡單工廠定義: 實現一個工廠函數對其他動作類選擇性的調用,實現使用者的實際需求。
將需要的功能分成多個組件,可以減少代碼的耦合性,提高代碼複用。在以後對某個功能改需求時,只需局部修改,不至於牽一髮而動全身,大大提高效率。
物件導向的設計思想是通過封裝、繼承、多態把程式的耦合度降低,而設計模式是對OOP的效率加成,合理運用設計模式可以使程式更加靈活,易於修改、複用。
然而,在區分功能組件的同時也並不是類越多越好,類的劃分是為了封裝,但分類的基礎是抽象,具有相同屬性和功能的對象的抽象集合才是類。
在此,以實現一個具有加減乘除功能的計算機來說明簡單原廠模式的實現和運用。
測試案例
[code]int main(){ //使用者輸入的兩個運算元和一個操作符 double number1, number2; char oper; std::cout << "Please enter a binary operation expressions(+-*/):\n"; std::cin >> number1 >> oper >> number2; //聲明操作對象 Operation<double> *operation = new Operation<double>; //聲明工廠對象 Factory<double> factory; //利用工廠類選擇運算子並返回運算對象(加減還是乘或除?) operation = factory.createOperate(oper); //設定兩個運算元.(此處注意operation已經是具體的衍生類別運算,調用setValue方法是繼承自基類的) operation->setValue(number1, number2); if(operation != NULL){ //計算結果,此處實際調用的是執行運算的衍生類別的getResult()方法。即基類指標指向衍生類別 double result = operation->getResult(); std::cout << "Result is: " << result << std::endl; }else std::cout << "Input is invalid!\n";//輸入運算式不合法 return 0;}
類的聲明(.h)
[code]//簡單原廠模式---實現一個計算機#ifndef _01SIMPLEFACTORY_H_#define _01SIMPLEFACTORY_H_//基類, 運算類模板template <typename T>class Operation{protected: //被衍生類別繼承並使用 T number1, number2;public: //計算結果 virtual T getResult(); //設定兩個運算值 void setValue(T , T ); };//衍生類別, 加法類template <typename T>class Add: public Operation<T>{public: //具體運算方式, 重寫基類的方法 T getResult()override; };//衍生類別, 減法類template <typename T>class Sub: public Operation<T>{public: //具體運算方式, 重寫基類的方法 T getResult()override; };//衍生類別, 乘法類template <typename T>class Mul: public Operation<T>{public: //具體運算方式, 重寫基類的方法 T getResult()override; };//衍生類別, 除法類template <typename T>class Div: public Operation<T>{public: //具體運算方式, 重寫基類的方法 T getResult()override; };//簡單工廠類template <typename T>class Factory{private: Operation<T> *operate;public: //根據傳入的操作符,建立具體的運算類。返回運算類對象 Operation<T>* createOperate(const char &op);};#endif
類的實現(.cpp)
[code]#include "01SimpleFactory.h"#include <iostream>//類方法實現template <typename T>void Operation<T>::setValue(T v1, T v2){//設定兩個運算值 number1 = v1; number2 = v2;}template <typename T>T Operation<T>::getResult(){ return 0;}template <typename T>T Add<T>::getResult(){ T res = number1 + number2; return res;}template <typename T>T Sub<T>::getResult(){ T res = number1 - number2; return res;}template <typename T>T Mul<T>::getResult(){ T res = number1 * number2; return res;}template <typename T>T Div<T>::getResult(){ double res = 0; //0不能作除數,可以作被除數 if(number2 != 0){ res = number1 / number2; return res; } std::cout << "0 cannot be used as a divisor\n"; return 0;}//Factory 方法,即工廠函數對其他動作類根據功能選擇性的調用template <typename T>Operation<T>* Factory<T>::createOperate(const char &op){ switch(op){ case '+': operate = new Add<T>; break; case '-': operate = new Sub<T>; break; case '*': operate = new Mul<T>; break; case '/': operate = new Div<T>; break; default: operate = NULL; break; } return operate;}
以上便是簡單原廠模式的實現。
總結:
建立型模式對類的執行個體化過程進行了抽象,能夠將對象的建立與對象的使用過程分離。
簡單原廠模式又稱為靜態Factory 方法模式,它屬於類建立型模式。在簡單原廠模式中,可以根據參數的不同返回不同類的執行個體。簡單原廠模式專門定義一個類來負責建立其他類的執行個體,被建立的執行個體通常都具有共同的父類。
簡單原廠模式包含三個角色:工廠角色負責實現建立所有執行個體的內部邏輯;抽象產品角色是所建立的所有對象的父類,負責描述所有執行個體所共有的公用介面;具體產品角色是建立目標,所有建立的對象都充當這個角色的某個具體類的執行個體。
簡單原廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以擷取你所需要的對象,而無須知道其建立細節。
簡單原廠模式最大的優點在於實現對象的建立和對象的使用分離,將對象的建立交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類的判斷邏輯代碼,而且產品較多時,Factory 方法代碼將會非常複雜。
簡單原廠模式適用情況包括:工廠類負責建立的對象比較少;用戶端只知道傳入工廠類的參數,對於如何建立對象不關心。
以上就是C++設計模式淺識簡單原廠模式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!