デザイン パターン C++ ファクトリ メソッド パターン

推奨読み込み設計パターン C++ シンプル ファクトリ パターン

ファクトリ メソッド パターンは、単純なファクトリ パターンの欠点に基づいて最適化されています. 単純なファクトリ パターンでは、製品の種類を増やしたり減らしたりするために、ファクトリの if-else 判定を変更する必要があることは誰もが知っています。これは明らかに私たちのコード開発における開始と終了の原則に準拠しておらず、展開するのは非常に面倒です.

ファクトリーメソッドパターン=シンプルなファクトリーパターン+「開閉原理」

定義のアイデア: ファクトリの親クラスは、製品オブジェクトを作成するためのパブリック インターフェイスの定義を担当し、ファクトリ サブクラスは、特定の製品オブジェクトの生成を担当します. これの目的は、ファクトリ サブクラスへの製品クラスのインスタンス化を遅らせることです。つまり、どの具体的な製品クラスをインスタンス化する必要があるかを判断するために、ファクトリ サブクラスを使用します。

利点:

  1. 特定のクラス名や特定のパラメーターを覚える必要はありません
  2. オブジェクトの作成と使用の分離を実現
  3. システムのスケーラビリティが向上し、開閉の原則に準拠します

短所:

  1. システム内のクラスはペアで追加され、システムの複雑さと理解が増します

該当するシナリオ:

  1. クライアントは特定の製品カテゴリの名前を知る必要はありませんが、対応する工場のみを知る必要があります
  2. クラスの作成と実装の詳細は気にしない

コードの実装: (携帯電話製品)
ここに画像の説明を挿入

//抽象手机
class AbstractPhone
{
    
    
public:
	virtual void ShowName() = 0;
};

//华为
class Huawei : public AbstractPhone
{
    
    
public:
	virtual void ShowName()
	{
    
    
		cout << "Huawei Phone" << endl;
	}
};

//小米
class Xiaomi : public AbstractPhone
{
    
    
public:
	virtual void ShowName()
	{
    
    
		cout << "Xiaomi Phone" << endl;
	}
};

//苹果
class Apple : public AbstractPhone
{
    
    
public:
	virtual void ShowName()
	{
    
    
		cout << "Apple Phone" << endl;
	}
};

//抽象工厂
class AbstractPhoneFactory
{
    
    
public:
	virtual AbstractPhone* CreatePhone() = 0;
};

//华为工厂
class HuaweiFactory : public AbstractPhoneFactory
{
    
    
public:
	virtual AbstractPhone* CreatePhone()
	{
    
    
		return new Huawei();
	}
};

//小米工厂
class XiaomiFactory : public AbstractPhoneFactory
{
    
    
public:
	virtual AbstractPhone* CreatePhone()
	{
    
    
		return new Xiaomi();
	}
};

//苹果工厂
class AppleFactory : public AbstractPhoneFactory
{
    
    
public:
	virtual AbstractPhone* CreatePhone()
	{
    
    
		return new Apple();
	}
};

テスト:

void test()
{
    
    
	//创建一个工厂
	AbstractPhoneFactory* factory = nullptr;
	//创建一个手机
	AbstractPhone* phone = nullptr;

	//指定工厂是华为工厂
	factory = new HuaweiFactory;
	//通过华为工厂创建一个手机
	phone = factory->CreatePhone();
	phone->ShowName();

	delete phone;
	delete factory;

	factory = new XiaomiFactory;
	phone = factory->CreatePhone();
	phone->ShowName();

	delete phone;
	delete factory;

	factory = new AppleFactory;
	phone = factory->CreatePhone();
	phone->ShowName();

	delete phone;
	delete factory;
}

実行結果:
ここに画像の説明を挿入
推奨される読み取り設計パターン C++ 抽象ファクトリ パターン

おすすめ

転載: blog.csdn.net/qq_44443986/article/details/117519327