设计模式之九:建造者模式(Builder)
建造者模式:
将一个复杂对象的建造过程和它的表示分离开来,这样同样的建造过程能够创建不同的表示。
Separate the construction of a complex object from its representation so that the same construction process can create different representations.
通俗一点就是假设流程是一样的,能够将这些流程抽象成一个类的一些接口。详细的创建过程能够在这个抽象类的子类中来实现。
C++中这个特性主要就是使用纯虚函数来实现。
UML图:
主要包含:
- Builder:指定了一个创建Product的一系列的接口。
- ConcreteBuilder:通过实现Builder中的接口详细实现了创建的步骤
- Director:定义了一个Buidler对象的引用来使用Builder的接口
- Product:表示须要创建的对象,ConcreteBuilder创建这个对象的每一部分。
详细的C++代码例如以下:
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <list>
#include <string>
using namespace std;
class Product
{
public:
void addPart(string str)
{
parts.push_back(str);
}
list<string>& getParts()
{
return parts;
}
private:
list<string> parts;
};
class Builder
{
public:
Builder()
{
product=new Product();
}
virtual void buildPart1()=0;
virtual void buildPart2()=0;
void getResult()
{
list<string>::iterator iter=product->getParts().begin();
for(;iter!=product->getParts().end();iter++)
{
std::cout<<*iter<<std::endl;
}
}
virtual ~Builder()
{
if(!product)
delete product;
}
protected:
Product *product;
};
class ConcreteBuilder1:public Builder
{
public:
void buildPart1()
{
product->addPart("part one");
}
void buildPart2()
{
product->addPart("part two");
}
};
class ConcreteBuilder2:public Builder
{
public:
void buildPart1()
{
product->addPart("part X");
}
void buildPart2()
{
product->addPart("part Y");
}
};
class Director
{
public:
Director()
{
}
Director(Builder * b):build(b)
{
}
void construct()
{
build->buildPart1();
build->buildPart2();
build->getResult();
}
private:
Builder *build;
};
int main()
{
std::cout<<"建造者模式測试"<<std::endl;
ConcreteBuilder1* cb1=new ConcreteBuilder1();
Director d1(cb1);
d1.construct();
ConcreteBuilder2 * cb2=new ConcreteBuilder2();
Director d2(cb2);
d2.construct();
return 0;
}
运行结果例如以下:
设计模式之九:建造者模式(Builder)的更多相关文章
- 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...
- iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数
转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...
- 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- IOS设计模式浅析之建造者模式(Builder)
定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...
- Net设计模式实例之建造者模式(Builder Pattern)
一.建造者模式简介(Brief Introduction) 建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示. 建造者模式的优点是 ...
- 设计模式 笔记 生成器(建造者)模式 Builder
//---------------------------15/04/08---------------------------- //builder 生成器(建造者)模式---对象创建型模式 /* ...
- Java学习笔记——设计模式之九.建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...
- 设计模式学习之建造者模式(Builder,创建型模式)(6)
假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 【设计模式】建造者模式 Builder Pattern
前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...
随机推荐
- 路飞学城Python-Day10
[37.函数-命名空间]命名空间又称为name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量 x = 1,存放于内存中,那名字x存放在哪里呢?名称空间正式存放名字x和1绑定关 ...
- 简洁的MVC思想框架——Nancy(Session的使用)
前文提到关于Nancy中GET和POST以及外部引用图片,css和JS的文件等操作.今天所讲的是Nancy关于Session相关操作. Session作为web开发中极其重要的一部分,而Nancy中S ...
- iOS开发——循环遍历的比较
常用的有for in.for循环.EnumerateObjectsUsingBlock 1.小规模的数据无所谓,但是对大量数据,for in 的遍历速度非常之快,不是for循环能比的: 2.对于数组, ...
- luogu P2664 树上游戏(点分治)
点分治真是一个好东西.可惜我不会 这种要求所有路经的题很可能是点分治. 然后我就不会了.. 既然要用点分治,就想,点分治有哪些优点?它可以\(O(nlogn)\)遍历分治树的所有子树. 那么现在的问题 ...
- 【转载】如何学习C++
原文地址: http://www.hankcs.com/program/cpp/how_to_learn_c__.html 1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<T ...
- redis.conf配置文件配置项解析
知识来源于 : https://blog.csdn.net/bsfz_2018/article/details/79061413[Redis在linux下的安装] daemonize:如需要在后台运行 ...
- 学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码
在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...
- 【转】C#正则表达式教程和示例
[转]C#正则表达式教程和示例 有一段时间,正则表达式学习很火热很潮流,当时在CSDN一天就能看到好几个正则表达式的帖子,那段时间借助论坛以及Wrox Press出版的<C#字符串和正则表达式参 ...
- 安装spark问题汇总
使用的版本是 spark-1.6.3-bin-without-hadoop 运行spark-shell报错 运行spark-sql报错找不到org.datanucleus.api.jdo.JDOPer ...
- [Webpack + React] Import CSS Modules with TypeScript and webpack
If you try to use CSS Modules in TypeScript the same way you would use them in JavaScript, with webp ...