簡單工廠定義: 實作一個工廠函數對其他操作類別選擇性的調用,實現使用者的實際需求。
將所需的功能分成多個元件,可減少程式碼的耦合性,提高程式碼重複使用。以後對某個功能改需求時,只需局部修改,不至於牽一發而動全身,大大提高效率。
物件導向的設計想法是透過封裝、繼承、多型把程式的耦合度降低,而設計模式是對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; } //工厂方法,即工厂函数对其他操作类根据功能选择性的调用 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; }
以上便是簡單工廠模式的實作。
總結:
創建型模式對類別的實例化過程進行了抽象,能夠將物件的建立與物件的使用過程分開。
簡單工廠模式又稱為靜態工廠方法模式,它屬於類別創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類別的實例。簡單工廠模式專門定義一個類別來負責創建其他類別的實例,而被創建的實例通常都具有共同的父類別。
簡單工廠模式包含三個角色:工廠角色負責實現創建所有實例的內部邏輯;抽象產品角色是所創建的所有物件的父類,負責描述所有實例所共有的公共介面;具體產品角色是創建目標,所有創建的物件都充當這個角色的某個具體類別的實例。
簡單工廠模式的要點在於:當你需要什麼,只需要傳入一個正確的參數,就可以獲取你所需要的對象,而無須知道其創建細節。
簡單工廠模式最大的優點在於實現對象的創建和對象的使用分離,將對象的創建交給專門的工廠類負責,但是其最大的缺點在於工廠類不夠靈活,增加新的具體產品需要修改工廠類別的判斷邏輯代碼,而且產品較多時,工廠方法代碼將會非常複雜。
簡單工廠模式適用情況包括:工廠類別負責創建的物件比較少;客戶端只知道傳入工廠類別的參數,對於如何建立物件不關心。
以上就是C++設計模式淺識簡單工廠模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!