設計モードC++ジェネレータモード


定義複雑なオブジェクトのコンストラクションをその表現から分離し、同じコンストラクションプロセスで異なる表現を作成できるようにします.
  • ジェネレータ(Builder)モードは、複雑な製品を一歩一歩構築し、複雑なオブジェクトのタイプとコンテンツを指定するだけで構築できます.ユーザーは内部の具体的な構築の詳細を知りません.
  • Builderベースクラス複雑な製品(Product)全プロセスの抽象ベースクラスを作成します.Builderベースクラスは、いくつかの構成部品(BuildPart)を提供する方法を提供します(ベースクラスはデフォルトの実装を提供します).具体的に製品を構築する過程はConcreteBuilderによって実現され、GetResult()は構造が完成したオブジェクトを取得する(この方法はベースクラスにはない!製品Productには一般的に抽象ベースクラスがないからである.製品に抽象ベースクラスがあればGetResultはベースクラスに入れることができる).
  • Directorはコンストラクション関数でBuilderのコンストラクションコンポーネントメソッドを呼び出し、最後のコンポーネントメソッド呼び出しが完了すると複雑な製品を生成します.Directorの役割は、1つの製品をパッケージする各部品のアセンブリプロセスです.
  • Builderベースクラスは共通の部分を抽出し、各部品メソッド(BuildPart)はサブクラス拡張によって実現される.
  • DirectorにはBuilderベースクラスポインタが集約されており、異なる特定のコンストラクタに適応できます.

  • 1、Builder.h
    #ifndef _BUILDER_H_
    #define _BUILDER_H_
    
    class BuilderS
    {
    public :
        virtual void makeFun1(int m)=0;
        virtual void makeFun2(int m)=0;
        virtual int getResult()=0;
    };
    
    class DirectorS
    {
    private :
        BuilderS* builder;
    public :
        DirectorS(BuilderS *b)
        {
            this->builder=b;
        }
        //    
        int construct();
    
    };
    
    //1#   
    class BuilderOne:public BuilderS
    {
    private :
        int result;
    public :
        BuilderOne(int r):result(r){}
    
        virtual void makeFun1(int m);
        virtual void makeFun2(int m);
        virtual int getResult();
    
    };
    
    //2#   
    class BuilderTwo:public BuilderS
    {
    private :
        int result;
    public :
        BuilderTwo(int r):result(r){}
    
        virtual void makeFun1(int m);
        virtual void makeFun2(int m);
        virtual int getResult();
    
    };
    
    
    #endif

    2、Builder.cpp
    #include "Builder.h"
    
    int DirectorS::construct()
    {
        builder->makeFun1(10);
        builder->makeFun2(2);
        builder->makeFun2(3);
    
        return builder->getResult();
    }
    
    void BuilderOne::makeFun1(int m){
        result+=m;
    }
    
    void BuilderOne::makeFun2(int m)
    {
        result*=m;
    }
    
    int BuilderOne::getResult()
    {
        return result;
    }
    
    void BuilderTwo::makeFun1(int m){
        result*=m;
    }
    
    void BuilderTwo::makeFun2(int m)
    {
        result+=m;
    }
    
    int BuilderTwo::getResult()
    {
        return result;
    }

    3、Client.cpp
    #include <iostream> 
    
    #include <string>
    #include "Builder.h"
    
    using namespace std;  
    
    
    int main()  
    {  
        //1#
        BuilderS * builder=new BuilderOne(10);
        DirectorS * director=new DirectorS(builder);
        cout<<director->construct()<<endl;
        //2#
        builder=new BuilderTwo(10);
        director=new DirectorS(builder);
        cout<<director->construct()<<endl;
    
        system("pause");  
        return 0;  
    }