シンプルなファクトリ定義: ユーザーの実際のニーズを満たすために、他の操作クラスを選択的に呼び出すファクトリ関数を実装します。
必要な機能を複数のコンポーネントに分割すると、コードの結合が減り、コードの再利用が向上します。将来、特定の機能に対する需要が変化した場合でも、部分的な修正だけで済むため、システム全体に影響を与えることがなく、効率が大幅に向上します。
オブジェクト指向の設計思想は、カプセル化、継承、ポリモーフィズムを通じてプログラムの結合を減らすことですが、設計パターンを適切に使用すると、プログラムをより柔軟に変更し、再利用できるようになります。 。
ただし、機能コンポーネントを区別する場合、クラスは多ければ多いほど良いというわけではなく、クラスを分割してカプセル化するのですが、分類の基本は同じ属性と機能を持つオブジェクトの抽象的な集合です。
ここでは、加算、減算、乗算、除算の関数を備えた計算機を実装して、単純なファクトリ パターンの実装と応用を説明します。
テストケース
[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; }
以上が簡単なファクトリパターンの実装です。
概要:
作成パターンは、クラスのインスタンス化プロセスを抽象化し、オブジェクトの作成とオブジェクトの使用を分離できます。
シンプルファクトリパターンは静的ファクトリメソッドパターンとも呼ばれ、クラス作成パターンに属します。単純なファクトリ パターンでは、さまざまなパラメータに従ってさまざまなクラスのインスタンスを返すことができます。単純なファクトリ パターンは、他のクラスのインスタンスの作成を担当するクラスを具体的に定義します。作成されたインスタンスには通常、共通の親クラスがあります。
単純なファクトリ パターンには 3 つのロールが含まれています: ファクトリ ロールは、すべてのインスタンスを作成する内部ロジックを実装する責任を負い、抽象プロダクト ロールは、作成されたすべてのオブジェクトの親クラスであり、すべてのインスタンスに共通のパブリック インターフェイスを記述する責任を負います。特定の製品ロールが作成ターゲットであり、作成されたすべてのオブジェクトはこのロールの具象クラスのインスタンスとして機能します。
シンプルなファクトリ パターンの重要なポイントは、何かが必要なときに、作成の詳細を知らなくても、正しいパラメーターを渡すだけで必要なオブジェクトを取得できることです。
シンプルなファクトリ パターンの最大の利点は、オブジェクトの作成とオブジェクトの使用を分離し、オブジェクトの作成を特殊なファクトリ クラスに任せることです。ただし、その最大の欠点は、ファクトリ クラスの柔軟性が十分でないことです。新たに特定の商品を追加するには、クラスの判定ロジックコードを変更する必要があり、商品数が多いとファクトリメソッドのコードが非常に複雑になります。
単純なファクトリ パターンに該当する状況には、ファクトリ クラスが比較的少数のオブジェクトの作成を担当すること、クライアントはファクトリ クラスに渡されるパラメータのみを知っており、オブジェクトの作成方法については考慮しないことが含まれます。
上記は、C++ デザイン パターンにおけるシンプルなファクトリー パターンの簡単な紹介の内容です。さらに関連するコンテンツについては、PHP 中国語 Web サイト (www.php.cn) に注目してください。