C++11実現の一例工場モデル


ファクトリモデルの主な目的は、特定のクラスのインスタンス化をサブクラスに遅延させることですが、一般的なファクトリメソッドモデルでは、新しい製品を追加する場合は、まず対応するファクトリクラスを追加する必要があります.c++のテンプレートで実現できることがわかりました.新しい製品は工場クラスを追加する必要はありません.
/*************************************************************************
    > File Name: factory.cpp
    > Author: ma6174
    > Mail: [email protected] 
    > Created Time: 2020 05 15      22 46 01 
 ************************************************************************/

#include
using namespace std;

//     
class Product
{
	public:
		Product() = default;
		~Product(){}
};

class ConcreteProduct : public Product
{
	public:
		ConcreteProduct() { cout << "ConcreteProduct constructor" << endl;};
		~ConcreteProduct() = default;
		ConcreteProduct(const ConcreteProduct& other) = default;
		ConcreteProduct& operator = (const ConcreteProduct& other) = default;
		
};

class ConcreteProduct1 : public Product
{
	public:
		ConcreteProduct1(){ cout << "ConcreteProduct1 constructor" << endl;}
		~ConcreteProduct1() = default;
};

//    ,CreateProduct             ,    ,   Product       
template 
class Factory
{
	private:
        //               protected,              ,            
		Factory() = default;

	public:
		~Factory() = default;
		Product* CreateProduct(){ return new T;}
		static Factory*  GetInstance()
		{ 
           //c++11     ,               
			static Factory ins;
			return &ins;
		} 
};



template 
Product* GetProductFromFactory(Factory *fat)
{
	return fat->CreateProduct();		
}

int main(int argc, char** argv)
{
	GetProductFromFactory(Factory::GetInstance());
	GetProductFromFactory(Factory::GetInstance());
	return 0;
}

以上のファクトリモードの最大の利点は、特定の製品を新規に追加する場合、各インタフェースを変更する必要がなく、クラス継承Productインタフェースを新規作成し、GetProductFromFactoryメソッドを呼び出すだけで新しいオブジェクトを生成できることです.オブジェクト向け設計の原則,開閉原則,拡張開放,修正閉鎖を満たす.
以前は、ConcreteProductAのような具体的な製品オブジェクトを追加し、製品オブジェクトが必要なときに直接new ConcreteProductAを追加すればいいのではないかと思っていましたが、苦労して工場を作る必要はありません.今考えてみると、理由は以下の点があります:1、他の人が提供したフレームワークを使用する場合、フレームワークはあなたのConcreteProductAを使用しなければなりませんが、フレームワークはどのようにあなたのクラスを知っていますか.フレームワークコードは固定されており、フレームワークに文new ConcreteProductAを追加するように修正することはできません.上記のように、フレームワークが提供するGetProductFromFactoryを呼び出すと、フレームワークコードを変更することなく、フレームワークが製品オブジェクトを取得できます.2、開閉の原則、私達は新機能の同時に、以前のコードに影響することができなくて、これは古いコードに対する変更をできるだけ少なくして、甚だしきに至っては変更しないことをやり遂げて、これは対象に向かってプログラミングして達成する目的です.