抽象ファクトリパターンAbstractFactory(c ++デザインパターン)

インタビュアー:抽象的なファクトリーモデルについて話してください

  • シンプルファクトリーモデルから始めて、シンプルファクトリーモデルは、ファクトリーを設定することによって製品コードの繰り返し作成のほとんどをテンプレート化し、ファクトリーはパラメーターを介してさまざまな製品を作成します。
  • これらのパラメータは事前​​に定義する必要があるため、つまり、このファクトリは特定の製品しか生成できません。製品を追加または削除する場合は、ファクトリを変更する必要があります。これは、開閉の原則に違反しているため、抽象化を追加しファクトリメソッドパターンを導入します。工場、各工場は製品の作成に責任がありますが、このように多くの工場クラスがあり、システムのオーバーヘッドが増加します。
  • つまり、抽象ファクトリモデルがあります。抽象ファクトリモデルでは、各ファクトリが製品ファミリの作成を担当します。つまり、抽象製品と抽象ファクトリの組み合わせが導入されます。

抽象ファクトリーモデルの開閉原理傾き

新製品ファミリーの場合、現時点で開閉の原則に準拠する新製品メーカーを追加するの同じです
が、新しく追加された製品レベルの構造、つまり新製品を追加する場合、現時点では開閉の原則は満たされていません。

抽象ファクトリーパターンコード

/*
 * @ Description: C++ Design Patterns___Abstract Factory
 * @ version: v1.0
 * @ Author: WeissxJ
 */

#include<iostream>
class ProductA                  //抽象产品A
{
    
    
    public:
        virtual ~ProductA() {
    
    }
        virtual const char * getName()=0;
        // ...
};

class ConcreteProductAX : public ProductA   //具体产品X
{
    
    
    public:
        ~ConcreteProductAX() {
    
    }
        const char* getName(){
    
    
            return "A->X";
        }
        // ...
};

class ConcreteProductAY : public ProductA   //具体产品Y
{
    
    
    public:
        ~ConcreteProductAY() {
    
    }
        const char* getName(){
    
    
            return "A->Y";
        }
        // ...
};

class ProductB
{
    
    
    public:
        virtual ~ProductB() {
    
    }
        virtual const char * getName()=0;
        // ...
};

class ConcreteProductBX : public ProductB
{
    
    
    public:
        ~ConcreteProductBX() {
    
    }
        const char* getName(){
    
    
            return "B->X";
        }
        // ...
};

class ConcreteProductBY : public ProductB
{
    
    
    public:
        ~ConcreteProductBY() {
    
    }
        const char* getName(){
    
    
            return "B->Y";
        }
        // ...
};

class AbstractFactory
{
    
    
    public:
        virtual ~AbstractFactory() {
    
    }
        virtual ProductA* createProductA()=0;
        virtual ProductB* createProductB()=0;
};

class ConcreteFactoryX : public AbstractFactory
{
    
    
    public:
        ~ConcreteFactoryX() {
    
    }
        ProductA *createProductA(){
    
    
            return new ConcreteProductAX();
        }
        ProductB *createProductB(){
    
    
            return new ConcreteProductBX();
        }
        // ...
};

class ConcreteFactoryY : public AbstractFactory
{
    
    
    public:
        ~ConcreteFactoryY() {
    
    }
        ProductA *createProductA(){
    
    
            return new ConcreteProductAY();
        }
        ProductB *createProductB(){
    
    
            return new ConcreteProductBY();
        }
        // ...
};

int main(){
    
    
    ConcreteFactoryX *factoryX = new ConcreteFactoryX();
    ConcreteFactoryY *factoryY = new ConcreteFactoryY();

    ProductA *p1 = factoryX->createProductA();
    std::cout << "Product: " << p1->getName() << std::endl;
  
    ProductA *p2 = factoryY->createProductA();
    std::cout << "Product: " << p2->getName() << std::endl;
  
    delete p1;
    delete p2;
    
    delete factoryX;
    delete factoryY;
  
    return 0;
}

おすすめ

転載: blog.csdn.net/qq_43477024/article/details/111655922