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

适用性: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头文件下,首先我们创建各种要用到的类:

 #ifndef _BUILDER_
#define _BUILDER_
#include <string>
#include <iostream>
using namespace std;
const int MAXSITE = ; class Site{
public:
Site(string str):_mName(str){}
string _mName;
}; class Wall:public Site{
public:
Wall():Site("wall"){}
}; class Wood:public Site{
public:
Wood():Site("wood"){}
}; class Grass:public Site{
public:
Grass():Site("grass"){}
}; class Door:public Site{
public:
Door():Site("door"){}
}; class Window:public Site{
public:
Window():Site("window"){}
}; class Room{
public:
Room(){
for(int i = ; i < MAXSITE; i++)
_mSite[i] = NULL;
}
void Printf()
{
for(int i = ; i < MAXSITE; i++)
{
if(_mSite[i] != NULL)
cout<<_mSite[i]->_mName<<endl;
}
}
Site* _mSite[MAXSITE];
};

要用到的类

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

class AbsBuilder{
public:
AbsBuilder(){} virtual void BuilderWall(){}
virtual void BuilderDoor(){}
virtual void BuilderWindow(){}
virtual void BuilderGrass(){}
virtual void BuilderWood(){} virtual Room* GetRoom() = ;
};

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

class BuilderA:public AbsBuilder{

public:
BuilderA():_mNum(){_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(){_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 ;
}

生成器模式(Builder)C++实现的更多相关文章

  1. 第9月第6天 push pop动画 生成器模式(BUILDER)

    1. https://github.com/MichaelHuyp/QQNews 2.生成器模式(BUILDER) class MazeBuilder { public: virtual void B ...

  2. C#设计模式——生成器模式(Builder Pattern)

    一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...

  3. 设计模式十: 生成器模式(Builder Pattern)

    简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...

  4. 跟着实例学习设计模式(6)-生成器模式builder(创建型)

    生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...

  5. 生成器模式Builder

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11406502.html 1. 定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的 ...

  6. 【设计模式】- 生成器模式(Builder)

    生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...

  7. 1.6建造者模式(生成器模式) Builder

    1.概念:将一个复杂对象的构建和他的表示分离,使得同样的构件可以创建不同的表示. 2.实例:肯德基和中餐,肯德基抽象了整个做菜的复杂过程(相同的构建),然后在不同的店铺进行实现(不同的表示).中餐往往 ...

  8. 生成器模式(Builder)

    1.本质:分离整体构建算法和部分构造 2.示意图: 3.功能: 构建复杂的产品,而且是细化的.分步骤的构建产品 分离构建算法和具体的构建实现 具体的构造实现可以方便的切换和扩展 4.优点: 1.松散耦 ...

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

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

随机推荐

  1. Luogu P2866 [USACO06NOV]糟糕的一天Bad Hair Day

    P2866 [USACO06NOV]糟糕的一天Bad Hair Day 题目描述 Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a ...

  2. RHEL6 配置Yum库

    在/mnt目录下创建子目录“/cdrom”(用于将iso文件挂载到此目录下) 镜像状态确定为“已连接”(“已连接”未勾选的情况下无法获得iso文件) 配置自动挂载文件 (系统开机时会主动读取“/etc ...

  3. Linux - redis主从同步

    目录 Linux - redis主从同步 环境准备 配置主从同步 测试写入数据,主库写入数据,检查从库数据 手动进行主从复制故障切换 Linux - redis主从同步 原理: 从服务器向主服务器发送 ...

  4. Flask - 请求处理流程和上下文源码分析

    目录 Flask - 请求处理流程和上下文 WSGI Flask的上下文对象及源码解析 0. 请求入口 1.请求上下文对象的创建 2. 将请求上下文和应用上下文入栈 3.根据请求的URl执行响应的视图 ...

  5. 【Codeforces 126B】Password

    [链接] 我是链接,点我呀:) [题意] 给你一个字符串s 让你从中选出来一个字符串t 这个字符串t是s的前缀和后缀 且在除了前缀和后缀之外的中间部位出现过. 且要求t的长度最长. 让你输出这个字符串 ...

  6. Divisible Group Sums

    Divisible Group Sums Given a list of N numbers you will be allowed to choose any M of them. So you c ...

  7. 暑假集训D20总结

    刷题 今天是瞎XX切题的一天 我要是不写题解的话,我自己都不知道刷了多少专题 数学什么的= = 生活 也就那样吧,没啥特别的 这两天倒是特别鬼畜 先是我点了一下某喵的$cena$,然后他的$cena$ ...

  8. HDU 3681

    也算难题,难在如何处理有些点可以无限次经过 问题. 这道题,其实很容易想到二分+TSP的状态压缩,但在处理上述问题时,确实没想到.题解是处理每一个Y或G或F点到其他YGF点的距离,BFS,这样就出现一 ...

  9. 卸载完百度影音以后天气助手还在,而且总是自己主动打开ie浏览器,解决方式

    今天暴风影音不好用了.我就安装了百度影音,还有意外发现.相同的视频,用百度影音看不清楚,然后我就直接卸载了.结果卸掉以天气小助手还是在,而且总弹白色小框框,各种广告.最忍不了的是还自己主动打开ie浏览 ...

  10. 使用同步适配器(sync adapter)数据传输

    在android设备与webserver之间实现数据同步能显著提高你的应用的有用性.让你的应用更受用户的欢迎. 比方说.你的数据上传给webserver,这就有了一个有用的备份.当用户的设备离线工作时 ...