一般的な設計モデルとそのC++実現(一):各種工場モデル

15093 ワード

転載先:https://www.jianshu.com/p/c951adc6aafb
私は《大话の设计のモード》学の设计のモードを见て、本の上の例はC#で书いたので、しかもはっきりと设计のモードの利点を表现するために书くコードはとても巨大です.私はここでC++で書き直して、簡単にして、復習と総括を便利にして、ついでにUML図を描く練習をします.ここでは,すべてのクラスがサービス側に定義され,main関数はクライアントに定義されていると考えられる.
単純ファクトリモード
3つのファクトリモードはいずれも作成型の設計モードである.現在、いくつかの製品を生産する工場がありますが、この簡単な工場はどれを生産するかを自分で判断することができます.
単純ファクトリモード
#include
#include
using namespace std;
class Producer
{
protected://     private,  public get,set  ,       
    string material1="potato";
    string material2="milk";
public:
    virtual string getResult()
    {
        string result=NULL;
        return result;
    }
};

class ClassA:public Producer
{
public:
    virtual string getResult()
    {
        string result=material1+material2;
        return result;
    }   
};

class ClassB:public Producer
{
public:
    virtual string getResult()
    {
        string result=material2+material1;
        return result;
    }   
};

class Factory
{
public: 
    static Producer* produce(char kind)
    {
        switch(kind)
        {
            case 'A':
            {
                Producer* pro=new ClassA();
                break;
            }
            case 'B':
            {
                Producer* pro=new ClassB();
                break;
            }   
        }   
    }
};

int main()
{
    Producer* pro;
    pro=Factory::produce('A');
    string result=pro->getResult(); 
    cout<endl;
}

単純な工場モデルは開放閉鎖の原則に合致しない.
工場モード
今は一つの工場だけではなく、総工場は指揮だけを担当し、サブ工場はどのように生産するかを決定しています.
工場モード
#include
#include
using namespace std;
class Producer
{
protected://     private,  public get,set  ,       
    string material1="potato";
    string material2="milk";
public:
    virtual string getResult()
    {
        string result=NULL;
        return result;
    }
};

class ProducerA:public Producer
{
public:
    virtual string getResult()
    {
        string result=material1+material2;
        return result;
    }   
};

class ProducerB:public Producer
{
public:
    virtual string getResult()
    {
        string result=material2+material1;
        return result;
    }   
};

class Factory
{
public: 
    virtual Producer* produce()=0;
};

class FactoryA:public Factory
{
public:
    Producer* produce() 
    {
        return new ProducerA;
    }
}; 
class FactoryB:public Factory
{
public:
    Producer* produce() 
    {
        return new ProducerB;
    }
};
int main()
{
    FactoryA* fac=new FactoryA();
    Producer* pro=fac->produce();
    string result=pro->getResult(); 
    cout<endl;
}

抽象ファクトリモード
これを見て、工場が新しい生産ラインを導入した場合、工場の構造を調整し、新しい部門を導入して新しい生産ラインを管理しなければならないことが分かったかもしれません.
ちゅうしょうこうじょう
この図ではインタフェースの実装は実は点線で示すべきですが、starumLのインタフェースはブスすぎて、無理に実装で代用しました.
#include
#include
using namespace std;
class Department1
{
protected://     private,  public get,set  ,       
    string material1="potato";
    string material2="milk";
public:
    virtual string getResult()=0;
};
class Department2
{
public:
    virtual string getResult()=0;
};

class ProducerA1:public Department1
{
public:
    virtual string getResult()
    {
        string result=material1+material2;
        return result;
    }   
};

class ProducerB1:public Department1
{
public:
    virtual string getResult()
    {
        string result=material2+material1;
        return result;
    }   
};
class ProducerA2:public Department2
{
public:
    virtual string getResult()
    {
        string result="new productA";
        return result;
    }
};
class ProducerB2:public Department2
{
public:
    virtual string getResult()
    {
        string result="new productB";
        return result;
    }
};
class Factory
{
public: 
    virtual Department1* produce1()=0;
    virtual Department2* produce2()=0;
};

class FactoryA:public Factory
{
public:
    ProducerA1* produce1()  
    {
        return new ProducerA1;
    }
    ProducerA2* produce2()
    {
        return new ProducerA2;
    }
}; 
class FactoryB:public Factory
{
public:
    ProducerB1* produce1()  
    {
        return new ProducerB1;
    }
    ProducerB2* produce2()
    {
        return new ProducerB2;
    }
};
int main()
{
    FactoryA* fac=new FactoryA();
    Department1* pro1=fac->produce1();
    Department2* pro2=fac->produce2();
    string result1=pro1->getResult(); 
    string result2=pro2->getResult();
    cout<endl<endl;
}

野月花輪
リンク:https://www.jianshu.com/p/c951adc6aafb
出典:簡書
著作権は作者の所有である.商業転載は著者に連絡して許可を得てください.非商業転載は出典を明記してください.