大话设计模式--建造者模式 Builder -- C++实现实例
1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。
用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了。
关键类Director,用它来控制建造过程,用它来隔离用户与建造过程的关联。
适用场合主要是用于创建一些复杂的对象, 这些对象内部的构建间的建造顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。
在创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式适用的模式。
建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。
实例骨架:
product.h product.cpp
#ifndef PRODUCT_H
#define PRODUCT_H #include <iostream>
#include <list>
#include <string>
using namespace std; class Product
{
public:
Product();
void addPart(string part);
void show(); private:
list<string> *parts;
}; #endif // PRODUCT_H
#include "product.h" Product::Product()
{
parts = new list<string>;
} void Product::addPart(string part)
{
parts->push_back(part);
} void Product::show()
{
for(list<string>::iterator i=parts->begin(); i!=parts->end(); i++)
cout << "part: " << *i << endl;
}
builder.h builder.cpp
#ifndef BUILDER_H
#define BUILDER_H #include "product.h" class Builder
{
public:
Builder();
void virtual builderPartA()=0;
void virtual builderPartB()=0;
virtual Product* getResult()=0;
}; #endif // BUILDER_H
#include "builder.h" Builder::Builder()
{
}
concretebuilder1.h concretebuilder1.cpp
#ifndef CONCRETEBUILDER1_H
#define CONCRETEBUILDER1_H #include "builder.h" class ConcreteBuilder1 : public Builder
{
public:
ConcreteBuilder1();
~ConcreteBuilder1();
void builderPartA();
void builderPartB();
Product* getResult(); private:
Product *product;
}; #endif // CONCRETEBUILDER1_H
#include "concretebuilder1.h" ConcreteBuilder1::ConcreteBuilder1()
{
product = new Product();
} ConcreteBuilder1::~ConcreteBuilder1()
{
delete product;
} void ConcreteBuilder1::builderPartA()
{
product->addPart("ConcreteBuilder1 A");
} void ConcreteBuilder1::builderPartB()
{
product->addPart("ConcreteBuilder1 B");
} Product* ConcreteBuilder1::getResult()
{
return product;
}
concretebuilder2.h concretebuilder2.cpp
#ifndef CONCRETEBUILDER2_H
#define CONCRETEBUILDER2_H #include "builder.h" class ConcreteBuilder2 : public Builder
{
public:
ConcreteBuilder2();
~ConcreteBuilder2();
void builderPartA();
void builderPartB();
Product* getResult(); private:
Product *product;
}; #endif // CONCRETEBUILDER2_H
#include "concretebuilder2.h" ConcreteBuilder2::ConcreteBuilder2()
{
product = new Product();
} ConcreteBuilder2::~ConcreteBuilder2()
{
delete product;
} void ConcreteBuilder2::builderPartA()
{
product->addPart("ConcreteBuilder2 A");
} void ConcreteBuilder2::builderPartB()
{
product->addPart("ConcreteBuilder2 B");
} Product* ConcreteBuilder2::getResult()
{
return product;
}
director.h director.cpp
#ifndef DIRECTOR_H
#define DIRECTOR_H #include "builder.h" class Director
{
public:
Director();
void construct(Builder *builder);
}; #endif // DIRECTOR_H
#include "director.h" Director::Director()
{
} void Director::construct(Builder *builder)
{
builder->builderPartA();
builder->builderPartB();
}
main.cpp
#include <iostream>
#include "product.h"
#include "concretebuilder1.h"
#include "concretebuilder2.h"
#include "director.h" using namespace std; int main()
{
cout << "Builder test !" << endl; Product *product = new Product();
ConcreteBuilder1 build1;
Director director;
director.construct(&build1);
product = build1.getResult();
product->show(); ConcreteBuilder2 build2;
director.construct(&build2);
product = build2.getResult();
product->show(); delete product; return 0;
}
大话设计模式--建造者模式 Builder -- C++实现实例的更多相关文章
- 设计模式—建造者模式(Builder)
title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...
- 设计模式:建造者模式(Builder)
流水作业大家应该都清楚吧!在流水作业中,我们可以将一些复杂的东西给构建出来,例如汽车.我们都知道汽车内部构件比较复杂,由很多部件组成,例如车轮.车门.发动机.方向盘等等,对于我们用户来说我们并不需要知 ...
- 23种设计模式--建造者模式-Builder Pattern
一.建造模式的介绍 建造者模式就是将零件组装成一个整体,用官方一点的话来讲就是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.生活中比如说组装电脑,汽车等等这些都是建 ...
- 设计模式--建造者模式Builder(创建型)
一.首先看建造者模式的UML图: 二.再来看一个建造者模式的例子 class Builder { public: virtual void BuildHead() {} virtual void Bu ...
- 说说设计模式~建造者模式(Builder)
返回目录 建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我 ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
- 设计模式 - 建造者模式 Builder Pattern
简介 场景 在创建复杂对象时,用户无须关心该对象所包含的属性以及它们的组装方式,只需要指定复杂对象的类型和内容就可以构建它们. 模式定义 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程 ...
- [工作中的设计模式]建造者模式builder
一.模式解析 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心. 以上是对建造者模式的官方定义,简单说就是对于复杂对象 ...
- 大话设计模式--访问者模式 Visitor -- C++实现实例
1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...
随机推荐
- gitlab配置smtp时,总是提示需要鉴权,记录一下爬坑过程。
配置好smtp,然后发送邮件时总是提示 Net::SMTPFatalError: 550 5.7.1 authentication is required 最后发现是因为在gitlab web界面上配 ...
- Android Activity去除标题栏和状态栏
一.在代码中设置public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除ti ...
- mapreduce学习资料
http://blog.csdn.net/tianjun2012/article/category/6794531 http://blog.csdn.net/tianjun2012/article/d ...
- ffmpeg截图
ffmpeg.exe -probesize 32768 -i "rtmp://localhost/live/1 live=1" -y -t 0.001 -ss 1 -f image ...
- ImportError: No module named '_sqlite3'
问题: Python 3.5.1 报错如下 Traceback (most recent call last): File "manage.py", line 16, in < ...
- Live555 中的客户端动态库.so的调用方式之一 程序中调用
1. 打开动态链接库: #include <dlfcn.h> void *dlopen(const char *filename, int flag); 该函数返回操作 ...
- IOS启动页动画(uiview 淡入淡出效果 )2
Appdelegate里面右个这个函数,只要它没结束,你的等待界面就不会消失.以在启动的时候做些动画 - (BOOL)application:(UIApplication *)application ...
- 解决Java工程URL路径中含有中文的情况
问题: 当Java工程路径中含有中文时,得不到正确的路径 *** 解决: 这其实是编码转换的问题.当我们使用ClassLoader的getResource方法获取路径时,获取到的路径被URLEncod ...
- double,long double及各变量数组内存开销
IEEE754浮点数的表示方法.C语言里对float类型数据的表示范围为-3.4*10^38-+3.4*10^38.double为-1.7*10^-308~1.7*10^308,long double ...
- 【BZOJ3784】树上的路径 点分治序+ST表
[BZOJ3784]树上的路径 Description 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a< ...