一.意图

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

二.动机

一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加。Bulider模式期望将解析原材料的过程与利用原材料生产产品的过程分离开,以达到用户不需要知道根据原材料构建产品的详细过程,并可以方便的增加新的产品。

三.适用性

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

四.类图

如以上类图所示,Director只负责组建整个流程,并不关心组建的具体过程,组建的细节由每一个Bulider负责。

五.实例代码

#include "Builder.h"
#include "Product.h"
#include <iostream>
#include <cstdlib>
#include <cstdio> class Director
{
public:
Builder* m_builder;
Product * m_product;
Director(Builder*builder) : m_builder(builder)
{ }
void ParseElement(int element)
{
switch (element)
{
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
}
} Product * GetProduct()
{
m_product = m_builder->GetProduct();
return m_product;
}
};

Director.h

#include "Builder.h"
#include "Product.h"
#include <iostream>
#include <cstdlib>
#include <cstdio> class Director
{
public:
Builder* m_builder;
Product * m_product;
Director(Builder*builder) : m_builder(builder)
{ }
void ParseElement(int element)
{
switch (element)
{
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
break;
case :
m_builder->BuildHouse();
}
} Product * GetProduct()
{
m_product = m_builder->GetProduct();
return m_product;
}
};

Builder.h

#ifndef PRODUCT_H_
#define PRODUCT_H_ class Product
{
public:
Product()
{
}
}; class ProductA : Product
{
public:
ProductA()
{
}
}; class ProductB : Product
{
public:
ProductB()
{
}
}; class ProductC : Product
{
public:
ProductC()
{
}
}; #endif

Product.h

#include "Director.h"
#include "Builder.h" void main()
{
Builder *builder = (Builder *)new BuilderA();
auto director = new Director(builder);
director->ParseElement();
director->ParseElement();
director->ParseElement();
auto product = director->GetProduct(); builder = (Builder *)new BuilderB();
director = new Director(builder);
director->ParseElement();
director->ParseElement();
director->ParseElement();
product = director->GetProduct(); builder = (Builder *)new BuilderC();
director = new Director(builder);
director->ParseElement();
director->ParseElement();
director->ParseElement();
product = director->GetProduct(); while(); }

Test Code

以上实例代码,以建房子为例,其中材料用整数1,2,3模拟,代表不同的材料。Director为解析材料的工作人员。有BuliderA,BuliderB,BuliderC三位建筑师,解析材料的工作人员把材料交给三位建筑师后,将会建造出三种不同的房子。测试结果如下:

六.效果

  • 可以改变一个产品的内部表示
  • 将构造代码和表示代码分开
  • 对构造过程进行更精细的控制。

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

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

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

  2. 设计模式(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) - ...

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

    本文系转载,转载地址http://blog.sina.com.cn/s/blog_59b6af690100zj3l.html,只供自己学习使用. 假设现在有三种产品,是玩具,都是由三部分组成,头,身体 ...

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

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

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

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

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

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

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

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

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

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

  9. 对象创建型模式------Abstract Factory(抽象工厂)

    1. 意图    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.2. 别名    Kit3. 动机        假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 ...

随机推荐

  1. 几个排序算法的python实现

    几个排序算法     几个排序算法 几个排序算法 冒泡排序 选择排序 插入排序 快速排序 quick sort 冒泡排序 冒泡排序是比较简单的排序方法,它的思路是重复的走过要排序的序列,一次比较两个元 ...

  2. (转) Graph-powered Machine Learning at Google

        Graph-powered Machine Learning at Google     Thursday, October 06, 2016 Posted by Sujith Ravi, S ...

  3. Oracle调整联机日志大小

    近期一个项目反馈月底高峰期时系统整体性能下降,抓取对应的AWR和ASH查看,等待事件排第一位的竟然是redo日志切换.进一步看每秒的日志量是5M多,而日志文件大小仅有200M.建议项目上调整日志大小, ...

  4. The error occurred while setting parameters--索引 3 超出范围 sqlserver2008

    这个问题不是jar包冲突,是表的问题,表里的ID设置成自动增加1,就可以了!

  5. python---pymysql

    pymysql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.2.7用MySQLdb,3.0用pymysql. #下载安装 pip3 install pymysql 使用 执 ...

  6. arcgis android 图上记录gps轨迹

    原文  arcgis android 图上记录gps轨迹 public class MainActivity extends Activity { MapView mMapView; Location ...

  7. mysql中in和exists二者的区别和性能影响

    mysql查询语句in和exists二者的区别和性能影响 还记得一次面试中被人问到in 和 exists的区别,当然只是草草做答,现在来做下分析. mysql中的in语句是把外表和内表作hash 连接 ...

  8. 49. Search in Rotated Sorted Array && Search in Rotated Sorted Array II

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  9. Ubuntu 安装 Xfce4 桌面

    sudo apt-get install xubuntu-desktop From: http://tieba.baidu.com/p/294762291

  10. Spark Streaming、HDFS结合Spark JDBC External DataSouces处理案例

    场景:使用Spark Streaming接收HDFS上的文件数据与关系型数据库中的表进行相关的查询操作: 使用技术:Spark Streaming + Spark JDBC External Data ...