现在的位置: 首页 > 综合 > 正文

生成器模式(builder模式)

2018年04月30日 ⁄ 综合 ⁄ 共 5380字 ⁄ 字号 评论关闭

builder模式的意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

刚看到这句话给人的感觉确实很拗口,难以捉摸。现在我们来细细分解一下这句话:什么样的对象能够称得上复杂对象?一般情况下这样对象的构建要有几个部分构成的。即一个产品是由几个部件构成的,先把一个产品分离成不同的部分,构建产品的构成就变成对各个部件重新组装的过程。下面先来看一下结构图:

                                                  

对结构图的参与者说明如下:

Builder:为创建一个产品对象Product的各个部件指定抽象接口。(即:包含多个部件的抽象接口)

ConcreteBuilder:实现Builder接口的构造,构造各个部件;提供检索产品的接口(返回该产品)

Director:实现组装过程,构造Builder接口的对象。

Product:即上文所指复杂对象,最终产品的接口。


下面引用http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html中列举的例子进行描述:

假设现在有三种产品,是玩具,都是由三部分组成,头,身体,和脚丫,
现在要实现生产不同组合产品的功能,例如
第一种产品是红头,绿身体,黑脚
第二种产品是绿头,黑身体,红脚
第三种产品是黑头,红身体,绿脚丫
现在现写一个build基类,
    class  builder//三个部件生产的基类
    {
    public:
        virtual void buildpartHead(const char* str="pre-define")=0;
        virtual void buildpartBody(const char* str="pre-define")=0;
        virtual void buildpartFoot(const char* str="pre-define")=0;
    };
具体实现类:第一种产品各个零部件的生产
class builder_Kindone:public builder
    {
    public:
        builder_Kindone(){cout<<"kindone is creating.......\n";}
        void buildpartHead(const char* str="red.")
        {
            first->setcolor_Head("red.head");
        }
        void buildpartBody(const char* str="blue.")
        {
            first->setcolor_Body("green.body");
        }
        void buildpartFoot(const char* str="black.")
        {
            first->setcolor_Foot("black.foot");
        }
       
      productFirst* GetProduct()
      {
         // buildpartHead();buildpartBody();buildpartFoot();
          return  first;
        }
    private:
        productFirst* first;
    };

第二种产品各个零部件的生产
class builder_Kindtwo:public builder
    {
    public:
        builder_Kindtwo(){cout<<"kindtwo is creating.......\n";}
        void buildpartHead(const char* str="green")
        {
            second->setcolor_Head("green.head");
        }
        void buildpartBody(const char* str="black")
        {
            second->setcolor_Body("black.body");
        }
        void buildpartFoot(const char* str="red")
        {
            second->setcolor_Foot("red.foot");
        }
       
     productSecond* GetProduct()
       //buildpartHead();buildpartBody();buildpartFoot();
         return  second;}
    private:
        productSecond* second;
    };

具体产品生产,即复杂对象:

class
builder_Kindone:public builder

    {
    public:
        builder_Kindone(){cout<<"kindone is creating.......\n";}
        void buildpartHead(const char* str="red.")
        {
            first->setcolor_Head("red.head");
        }
        void buildpartBody(const char* str="blue.")
        {
            first->setcolor_Body("green.body");
        }
        void buildpartFoot(const char* str="black.")
        {
            first->setcolor_Foot("black.foot");
        }
       
      productFirst* GetProduct()
      {
         // buildpartHead();buildpartBody();buildpartFoot();
          return  first;
        }
    private:
        productFirst* first;
    };
第二种产品各个零部件的生产
class builder_Kindtwo:public builder
    {
    public:
        builder_Kindtwo(){cout<<"kindtwo is creating.......\n";}
        void buildpartHead(const char* str="green")
        {
            second->setcolor_Head("green.head");
        }
        void buildpartBody(const char* str="black")
        {
            second->setcolor_Body("black.body");
        }
        void buildpartFoot(const char* str="red")
        {
            second->setcolor_Foot("red.foot");
        }
       
     productSecond* GetProduct()
       //buildpartHead();buildpartBody();buildpartFoot();
         return  second;}
    private:
        productSecond* second;
    };
现在来看看产品类 第一种产品,包括三个部件
class productFirst
    {
    public:
        void setcolor_Head(const char* str="red.head")
        {
          cout<<"head's color is.\t"<<str<<endl;
        }
        void setcolor_Body(const char* str="blue.body")
        {
          cout<<"body's color is.\t"<<str<<endl;
        }
        void setcolor_Foot(const char* str="black.foot")
        {
          cout<<"foot's color is.\t"<<str<<endl;
        }
    private:
        char* color;
        //Head head;Body body;Foot foot;
    };
第二种产品,也是包括三个部件
    class
productSecond

    {
    public:
        void setcolor_Head(const char* str)
        {
          cout<<"head's color is.\t"<<str<<endl;
        }
        void setcolor_Body(const char* str)
        {
          cout<<"body's color is.\t"<<str<<endl;
        }
        void setcolor_Foot(const char* str)
        {
          cout<<"foot's color is.\t"<<str<<endl;
        }
        private:
        //Head head;Body body;Foot foot;
        };

组装类direct类
    class
direct

    {
    public:
        void construct(builder* b)
        {
           b->buildpartHead();
           b->buildpartBody();
           b->buildpartFoot();
           cout<<"making all parts together......\n"<<endl;
//这里实现某种产品的组装过程,
        }
    };
}

客户端使用:

void
job_test_builder()

{
 
    using namespace  build_pattern;
    builder_Kindtwo* pf=new builder_Kindtwo();//要生产的某种产品
    direct d;
    d.construct(pf);//组装
    //d.construct(new builder_Kindone());
    productSecond* F=pf->GetProduct();//组装结果
   
}

一个复杂对象是由多个部件组成的,Builder模式是把复杂对象的创建和部件的创建分别开来,分别用Builder类和Director类来表示.
      用Director构建最后的复杂对象,而在上面Builder接口中封装的是如何创建一个个部件(复杂对象是由这些部件组成的),也就是说Director的内容是如何将部件最后组装成成品:
通俗讲解:Builder模式的理解


简单地说,就好象我要一座房子住,可是我不知道怎么盖 (简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高), 于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙,
这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工 要,记住了!


就象国内好多企业上erp一样,上erp,首先得找软件公司呀,找到软件公司后,软件公司说,我只知道怎么写软件,就知道怎 么实现,不清楚整个erp的流程。好,那我们还得找一个咨询公司,好,找到德勤了,德勤说好,我要软件怎么做,软件公司怎么做,我就能保证软件能为你们提
供erp系统了。


此模式是为了让设计和施工解耦,互不干扰。



PS:坚持是人生最好的老师,同时坚持也是每个人的最大敌人,尤其面对的是懒散、惰性、意志不坚定。。。。。。



抱歉!评论已关闭.