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


序文

この記事では、C++ のファクトリ メソッド パターンを学習します。

1. ファクトリメソッドパターンの紹介

ファクトリ メソッド パターンは、具体的なクラスを明示的に指定せずに、ファクトリ メソッドを通じてオブジェクトを作成するための作成設計パターンです。このパターンは、オブジェクトを作成するインターフェイスを定義しますが、特定のオブジェクトの作成はそのサブクラスに任せます。これにより、オブジェクトの作成と使用が分離され、コードの柔軟性とスケーラビリティが向上します。

UML 構造図:

ここに画像の説明を挿入します

2. ファクトリメソッドパターンと簡易ファクトリパターンの比較

1.実装方法:

単純なファクトリ パターン: ファクトリ クラスはオブジェクトの作成を担当し、渡されたパラメータまたは条件に従ってどの特定のオブジェクトを作成するかを決定します。すべてのプロダクトの作成ロジックを集約したファクトリクラスに相当します。
ファクトリ メソッド パターン: オブジェクトの作成をサブクラスに延期し、特定の各製品には、製品の作成を担当する対応するファクトリ クラスがあります。各ファクトリー クラスは、特定の製品の作成のみを担当します。

2. 柔軟性と拡張性:

シンプル ファクトリ モード: ファクトリ クラスを通じてオブジェクトの作成を一元管理します。新しい製品を追加する場合、ファクトリ クラスのコードを変更する必要があり、オープンクローズ原則 (拡張のためにオープン、変更のためにクローズ) に準拠しません。 。
ファクトリ メソッド パターン: 各特定の製品には対応するファクトリ クラスがあります。新しい製品を追加する場合は、新しい特定の製品と対応するファクトリ クラスを追加するだけでよく、既存のコードを変更する必要はありません。開閉の原則に従ってください。

3. 結合度:

シンプル ファクトリ モード: クライアント コードはファクトリ クラスに依存して、ファクトリ クラスを通じて特定の製品のインスタンスを作成する必要があります。
ファクトリ メソッド パターン: クライアント コードは、抽象ファクトリと抽象製品クラスに依存し、抽象ファクトリを通じて特定の製品のインスタンスを作成します。クライアント コードは、具体的なファクトリ クラスや具体的な製品クラスから分離されています。

4. クラス数:

単純なファクトリ パターン: すべての製品を作成するために必要なファクトリ クラスは 1 つだけですが、ファクトリ クラスは非常に大きくなる可能性があります。
ファクトリ メソッド パターン: 特定の製品ごとに対応するファクトリ クラスがあり、クラスの数は単純なファクトリ パターンよりも多くなりますが、オブジェクトの作成をより詳細に管理できます。

3. ファクトリメソッドパターンの適用シナリオ

1. オブジェクトの作成は、特定のインターフェイスまたは抽象クラスに従う必要があります。ファクトリ メソッド パターンは、共通のインターフェイスまたは抽象クラスを共有する関連オブジェクトのグループを作成するのに適しています。抽象ファクトリと具象ファクトリ クラスを定義することにより、作成されたオブジェクトが同じインターフェイスまたは抽象クラスの定義に準拠していることを確認できます。

2. 作成される特定のオブジェクトはサブクラスによって決定される必要があります。ファクトリ メソッド パターンはオブジェクトの作成をサブクラスに遅らせ、サブクラスは特定のニーズに基づいて実装する特定のオブジェクトを選択できます。これにより、クライアント コードを変更せずに、特定のオブジェクト タイプを動的に追加または切り替えることができます。

3. 拡張機能を通じて新しい製品を追加する必要がある: 新しい製品をシステムに追加する必要がある場合、ファクトリ メソッド パターンは、新しい製品の追加を容易にする拡張メカニズムを提供できます。既存のコードを変更せずに、新しい具体的な製品クラスと対応する具体的なファクトリ クラスを作成するだけで済みます。

4. クライアント コードと特定の製品の間の結合を分離する必要がある: 抽象ファクトリと具象ファクトリ クラスを導入することにより、ファクトリ メソッド パターンは特定の製品の作成プロセスからクライアント コードを分離できます。クライアントは、抽象ファクトリと抽象プロダクト クラスに依存するだけでよく、特定のオブジェクトを独自に直接作成する必要がないため、結合度が減少します。

4. ファクトリメソッドパターンのサンプルコード

#include <iostream>
#include <string>

// 抽象产品类
class Product {
    
    
public:
    virtual void use() const = 0;
};

// 具体产品类 A
class ConcreteProductA : public Product {
    
    
public:
    void use() const override {
    
    
        std::cout << "Using ConcreteProductA" << std::endl;
    }
};

// 具体产品类 B
class ConcreteProductB : public Product {
    
    
public:
    void use() const override {
    
    
        std::cout << "Using ConcreteProductB" << std::endl;
    }
};

// 抽象工厂类
class Factory {
    
    
public:
    virtual Product* createProduct() const = 0;
};

// 具体工厂类 A
class ConcreteFactoryA : public Factory {
    
    
public:
    Product* createProduct() const override {
    
    
        return new ConcreteProductA();
    }
};

// 具体工厂类 B
class ConcreteFactoryB : public Factory {
    
    
public:
    Product* createProduct() const override {
    
    
        return new ConcreteProductB();
    }
};

int main() {
    
    
    // 使用具体工厂类 A 创建产品对象
    Factory* factoryA = new ConcreteFactoryA();
    Product* productA = factoryA->createProduct();
    productA->use();

    delete productA;
    delete factoryA;

    // 使用具体工厂类 B 创建产品对象
    Factory* factoryB = new ConcreteFactoryB();
    Product* productB = factoryB->createProduct();
    productB->use();

    delete productB;
    delete factoryB;

    return 0;
}

要約する

この記事ではここで説明します。

おすすめ

転載: blog.csdn.net/m0_49476241/article/details/132482670