C++设计模式之Builder模式

_____________________________新手初学,望大神指点__________________________________

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

适用性:1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

    2.当构建过程必须允许被构建的对象有不同的表示时。

效果:   1.使得可以改变一个产品的内部表示。

    2.隐藏产品的内部结构。

    3.使得构造代码和表示代码分离。

    4.使得可以对构建过程进行更精确的控制。

代码实例:

代码以构建Room为实例,而Room由四个Site组成,Site可以是Wall、Window、Door、Grass、Wood。(其中

wood和grass分别表示木制墙和玻璃墙). 这里Room可以有3 Wall  1 Door 或 2 wall 1 Door 1 Window等各种

表示。构建在具体Builder中实现,而在Director中表示,体现了效果3.

在Builder头文件下,首先我们创建各种要用到的类:

 1 #ifndef _BUILDER_
 2 #define _BUILDER_
 3 #include <string>
 4 #include <iostream>
 5 using namespace std;
 6 const int MAXSITE = 4;
 7
 8 class Site{
 9 public:
10     Site(string str):_mName(str){}
11     string _mName;
12 };
13
14 class Wall:public Site{
15 public:
16     Wall():Site("wall"){}
17 };
18
19 class Wood:public Site{
20 public:
21     Wood():Site("wood"){}
22 };
23
24 class Grass:public Site{
25 public:
26     Grass():Site("grass"){}
27 };
28
29 class Door:public Site{
30 public:
31     Door():Site("door"){}
32 };
33
34 class Window:public Site{
35 public:
36     Window():Site("window"){}
37 };
38
39 class Room{
40 public:
41     Room(){
42         for(int i = 0; i < MAXSITE; i++)
43             _mSite[i] = NULL;
44     }
45     void Printf()
46     {
47         for(int i = 0; i < MAXSITE; i++)
48         {
49             if(_mSite[i] != NULL)
50             cout<<_mSite[i]->_mName<<endl;
51         }
52     }
53     Site* _mSite[MAXSITE];
54 };

要用到的类

接着我们创建AbsBuilder,这里提供给向导器一个构造产品的抽象接口。因为不知道具体哪个类被创建并用于组成目标类,所以达到了效果2.

class AbsBuilder{
public:
AbsBuilder(){}

virtual void BuilderWall(){}
virtual void BuilderDoor(){}
virtual void BuilderWindow(){}
virtual void BuilderGrass(){}
virtual void BuilderWood(){}

virtual Room* GetRoom() = 0;
};

然后是具体创建BuilderA/B...,体现了可以改变产品的内部表示(效果1.)

class BuilderA:public AbsBuilder{

public:
    BuilderA():_mNum(0){_mpRoom = new Room; }

    virtual void BuilderWall(){_mpRoom->_mSite[_mNum++] = new Wall;}
    virtual void BuilderDoor(){_mpRoom->_mSite[_mNum++] = new Door;}
    virtual void BuilderWindow()
    {
        _mpRoom->_mSite[_mNum++] = new Window;
        _mpRoom->_mSite[_mNum++] = new Window;
    }

    virtual Room* GetRoom(){return _mpRoom; }
private:
    Room* _mpRoom;
    int _mNum;
};

class BuilderB:public AbsBuilder{

public:
    BuilderB():_mNum(0){_mpRoom = new Room; }
    virtual void BuilderWood(){_mpRoom->_mSite[_mNum++] = new Wood;}
    virtual void BuilderDoor(){_mpRoom->_mSite[_mNum++] = new Door;}
    virtual void BuilderWindow()
    {
        _mpRoom->_mSite[_mNum++] = new Grass;
        _mpRoom->_mSite[_mNum++] = new Grass;
    }

    virtual Room* GetRoom(){return _mpRoom; }
private:
    Room* _mpRoom;
    int _mNum;
};

#endif

BuilderA/B

在Director头文件下,创建类Director. 因为这里一步步构造产品,体现了效果4.

class Director{
public:
    Director(AbsBuilder* builder){_mBuilder = builder;}
    void construct()
    {
        _mBuilder->BuilderDoor();
        _mBuilder->BuilderWall();
        _mBuilder->BuilderWindow();
        _mBuilder->BuilderGrass();
        _mBuilder->BuilderWood();
    }
private:
    AbsBuilder* _mBuilder;
};

main函数中:

#include <iostream>
using namespace std;

#include "Builder.h"
#include "Director.h"

int main()
{
    BuilderA* pBuilderA = new BuilderA;
    Director directro(pBuilderA);
    directro.construct();
    Room* roomA = pBuilderA->GetRoom();
    roomA->Printf();

    cout<<endl;

    BuilderB* pBuilderB = new BuilderB;
    Director directroB(pBuilderB);
    directroB.construct();
    Room* roomB = pBuilderB->GetRoom();
    roomB->Printf();

    cout<<endl;
    return 0;
}
时间: 2024-10-08 20:27:16

C++设计模式之Builder模式的相关文章

Java设计模式--Java Builder模式

1.Java Builder模式主要是用一个内部类去实例化一个对象,避免一个类出现过多构造函数,而且构造函数如果出现默认参数的话,很容易出错. public Person(String name) Person(String name, int age) Person(String name, int age, boolean sex) 2.Android OkHttp框架中Request.Response类都使用了Java Builder模式. 3.下面举一个小例子: /** * @autho

设计模式之Builder模式

一.感性认识 二.Builder模式 1.定义 一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.即构建过程相同,但是子部件却不相同. 2.结构说明 Builder: 创建者接口(也可定义为抽象类),定义创建一个Product对象的所需各个部件的操作 ConcreteBuilder: 具体的创建者实现,实现各个部件的创建并负责组装Product对象的各个部件:同时提供一个让用户访问的组装完成的Product对象的方法 Director: 导向者,主要用来使用Builder接

设计模式之Builder模式(建造者模式)

部分转载:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/19/2599980.html 一个人活到70岁以上,都会经历这样的几个阶段:婴儿,少年,青年,中年,老年.并且每个人在各个阶段肯定是不一样的呀,我觉得可以说世界上不存在两个人在人生的这5个阶段的生活完全一样,但是活到70岁以上的人,都经历了这几个阶段是肯定的.实际上这是一个比较经典的建造者模式的例子了. 1.初识建造者模式 建造者模式实际上是常用的设计模式.顾名思义,builde

设计模式--建造者(Builder)模式

将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示                                                         --<设计模式>GOF Insus.NET在ASP.NET环境中,列举一个建造者设计模式(Builder)例子,以最帖近开发环境与需求. 开发站点时,我们需要开发新闻类,视频类,图片类等等.每个网页还有可能是页头,内容,页脚等.开发这些页头,内容与页脚时,我们会使用用户控件来写好,加载至网页中去. 每个类别的网页,

每天一个设计模式-7 生成器模式(Builder)

每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式. 导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾. 二.问题分析 无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同.即他们的构造算法固定,只是生成的结果不同:能不能把算法(构建)和结果(外观)分离出

设计模式初学者笔记:Builder模式

[作者:byeyear    Email:[email protected]    首发:cnblogs    转载请注明] 在本文的开头,先森森的鄙视下自己……将Builder模式反反复复读了七八遍,才敢说自己对其有了初步的了解.这比花在Abstract Factory上的时间长多了.如果GoF将Builder模式放在第一个讲,估计我就会把这本书归结成天书直接扔一边了. Builder模式的关键在于,将“要做什么”与“做出来”分离,将“如何装配”与“完成装配”分离: Director知道“要做

[设计模式] 4 创建者模式 builder

转载http://blog.csdn.net/wuzhekai1985/article/details/6667467 建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP).<大话设计模式>举了一个很好的例子——建造小人,一共需建造6个部分,头部.身体.左右手.左右脚.与工厂模式不同,建造者模式是在导向者的控制下一步一步构造产品的.建造小人就是在控制下一步步构造出来的.创建者模式可以能更精细的控制构建过程,从而能更精细的控制所得产品的内部结构.下面给

C#设计模式之五创建者模式(Builder)【创建型】

一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一个复杂的物品,它主要是由CPU.主板.硬盘.显卡.机箱等组装而成的.手机当然也是复杂物品,由主板,各种芯片,RAM 和ROM  摄像头之类的东西组成.但是无论是电脑还是手机,他们的组装过程是固定的,就拿手机来说,组装流水线是固定的,不变的,但是把不同的主板和其他组件组装在一起就会生产出不同型号的手机.那么在软件系统中是不是也会存在这样的对象

C#设计模式之四建造者模式(Builder Pattern)【创建型】

原文:C#设计模式之四建造者模式(Builder Pattern)[创建型] 一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一个复杂的物品,它主要是由CPU.主板.硬盘.显卡.机箱等组装而成的.手机当然也是复杂物品,由主板,各种芯片,RAM 和ROM  摄像头之类的东西组成.但是无论是电脑还是手机,他们的组装过程是固定的,就拿手机来说,组装流水线