对象创建型模式------Builder(生成器)

本文系转载,转载地址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 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;
    }
};

客户端的使用

builder_Kindtwo* pf = new builder_Kindtwo();
    direct d;
    d.construct(pf);
    productSecond* f = pf->GetProduct();

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


通俗讲解:Builder模式的理解
简单地说,就好象我要一座房子住,可是我不知道怎么盖 (简单的砌墙,层次较低),也不知道怎么样设计(建几个房间,几个门好看,层次较高), 于是我需要找一帮民工,他们会砌墙,还得找个设计师,他知道怎么设计,我还要确保民工听设计师的领导,而设计师本身也不干活,光是下命令,这里砌一堵墙, 这里砌一扇门,这样民工开始建设,最后,我可以向民工要房子了。在这个过程中,设计师是什么也没有,除了他在脑子里的设计和命令,所以要房子也是跟民工 要,记住了!
就象国内好多企业上erp一样,上erp,首先得找软件公司呀,找到软件公司后,软件公司说,我只知道怎么写软件,就知道怎 么实现,不清楚整个erp的流程。好,那我们还得找一个咨询公司,好,找到德勤了,德勤说好,我要软件怎么做,软件公司怎么做,我就能保证软件能为你们提 供erp系统了。此模式是为了让设计和施工解耦,互不干扰。

 

 

 

posted @ 2013-07-12 16:48  2011winseu  阅读(426)  评论(0编辑  收藏  举报