本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用。

假设现在有三种产品,是玩具,都是由三部分组成,头,身体,和脚丫,
现在要实现生产不同组合产品的功能,例如
第一种产品是红头,绿身体,黑脚
第二种产品是绿头,黑身体,红脚
第三种产品是黑头,红身体,绿脚丫
现在现写一个build基类,

class  builder
{
public:
virtual void buildpartHead(const char* str="pre-define")=;
virtual void buildpartBody(const char* str="pre-define")=;
virtual void buildpartFoot(const char* str="pre-define")=;
};

具体实现类:第一种产品各个零部件的生产

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系统了。此模式是为了让设计和施工解耦,互不干扰。

对象创建型模式------Builder(生成器)的更多相关文章

  1. 对象创建型模式------Builder(生成器或建造者模式)(2)

    链接转自:http://blog.csdn.net/wuzhekai1985/article/details/6667467 主要思想是:首先有个指挥家思想者将大体的设计思路设计出来,然后寻找一部分工 ...

  2. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  3. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

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

    一.意图 将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示. 二.动机 一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加.Bu ...

  5. singleton(单件)-对象创建型模式

    1.意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2.动机 对一些类来说,只有一个实例是很重要的.让类自身负责保存它唯一的实例,这个类可以保证没有其他实例可以被创建(通过截取创建新对象 ...

  6. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  7. Singleton模式——对象创建型模式

    Singleton模式即为单例模式/单件模式. (一)意图--保证一个类仅有一个实例,并提供一个访问它的全局访问点. 如一台计算机可以有多个端口,但是应该统一管理这些端口,避免访问冲突.--选择Sin ...

  8. ProtoType(原型)-对象创建型模式

    1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.动机 通过拷贝或者“克隆”一个类的实例来创建新的实例. 3.适用性 当一个系统应该独立于它的产品创建.构成和表示时,要使 ...

  9. 创建型模式——Builder

    1.意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 2.结构 3.参与者 Builder为创建一个Product对象的各个部件指定抽象接口 ConcreteBuild ...

随机推荐

  1. Spring配置MyBatis

    1.MyBatis配置文件(mybatis-config) <?xml version="1.0" encoding="UTF-8"?> <! ...

  2. intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

    ActivityA到ActivityBintent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);//ActivityB不加入后退栈android:noHisto ...

  3. php中带mb的字符串处理函数

    int strlen ( string $string ) int mb_strlen ( string $str [, string $encoding ] ) encoding参数为字符编码.如果 ...

  4. sql STUFF用法

    sql STUFF用法 1.作用 删除指定长度的字符,并在指定的起点处插入另一组字符. 2.语法 STUFF ( character_expression , start , length ,char ...

  5. Android设计模式系列--原型模式

    CV一族,应该很容易理解原型模式的原理,复制,粘贴完后看具体情况是否修改,其实这就是原型模式.从java的角度看,一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法.原型模 ...

  6. Java 判断是否为汉字 判断是否为乱码 判断字符串是否为双整型数字 整数 数字

    /**  * 判断是否为汉字  *   * @param str  * @return  */ public static boolean isGBK(String str) {  char[] ch ...

  7. URL和DNS解析

    以下内容摘自<Go Web编程>,介绍的通俗易懂. 我们浏览网页都是通过URL访问的,那么URL到底是怎么样的呢? URL(Uniform Resource Locator)是“统一资源定 ...

  8. OpenVPN 如何记住用户名和密码

    最近在使用OpenVPN,但是没有记住用户名和密码功能,太坑人,研究一下发现是可以的. 1. 在OpenVPN安装目录下\OpenVPN\config文件夹中找到vpnserver.ovpn文件. 2 ...

  9. VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群

    VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群 下一篇:VMWare9下基于Ubuntu12.10搭建Hadoop-1.2.1集群-整合Zookeeper和Hbase 近期 ...

  10. Linux 基础 —— RPM

    http://liaoph.com/linux-rpm/ 这篇文章主要讲 RPM 软件包管理器的使用. 软件包的演变史 最早期时,软件包是一些可以运行的程序组成的集合,可能还要加上若干配置文件和动态库 ...