大话设计模式--建造者模式 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. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以 ...
随机推荐
- Httpclient 实现带参文件上传
这里直接贴出的是我封装好的doPostFile方法,httpclient 的版本是3.1. public static String doPostFile(String url, Part[] par ...
- iOS CAGradientLayer白色渐变至上向下
项目需求当显示富文本内容高度太高的的时候不全部显示出来,而是显示查看更多按钮,当点击查看更多时把全部内容展开.同时未展开部分要加一个渐变模糊的效果. 上效果图: 这里要用到CAGradientLaye ...
- iOS lipo 移除i386 x86_64两个平台
由于 iOS 编译的特殊性,为了方便开发者使用,我们将 i386 x86_64 armv7 arm64 几个平台都合并到了一起, 所以使用动态库上传appstore时需要将i386 x86_64两个平 ...
- [译]GLUT教程 - 创建和关闭子窗体
Lighthouse3d.com >> GLUT Tutorial >> Subwindows >> Creating and Destroying Subwind ...
- ListView中CheckBox使用问题
因为CheckBox的点击事件优先级比ListView的高,所以当ListView中使用CheckBox会导致ListView的setOnItemClickListener失去响应. 解决的方法:在C ...
- 昂贵的聘礼 - poj 1062 (Dijkstra+枚举)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 39976 Accepted: 11596 Description 年 ...
- 从零开始学android -- Service
废话不多说了,Service是四大组件之一,是一个后台处理长时间运行在主线程不需要依赖ui界面显示的应用组件,切记不能在service中做耗时操作,会阻塞主线程,要做也要在service中开个子线程做 ...
- 开发app应用的开源项目推荐
app检测内存泄漏 请看这里:LeakCanary Android 和 Java 内存泄露检测 app应用想要控制状态栏 StatusBarUtil :https://github.com/laobi ...
- xml schema复杂类型
xml schema复杂类型 对于复杂类型,xs:complexType, xs:sequence子节点必须有. <?xml version="1.0"?> <x ...
- No breeds found in the signature, a signature update is recommended
cobbler 2.6.11 遇到这个问题,需要 >> cobbler signature update >> and cobblerd restart 转自: https:/ ...