设计模式之九:建造者模式(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 ...
随机推荐
- ActiveMQ学习笔记(18)----Message高级特性(二)
1. Blob Message 有些时候,我们需要传递Blob(Binary Large Objects)消息,在5.14之前,(5.12和5.13需要在jetty.xml中手动开启)可以按照如下的方 ...
- SpringCloud学习笔记(9)----Spring Cloud Netflix之声明式 REST客户端 -Feign的使用
1. 什么是Feign? Feign是一种声明式.模板化的HTTP客户端,在SpringCloud中使用Feign.可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到 ...
- 搭建appium环境
1.下载jdk1.8 配置环境变量 JAVA_HOME---------->你的jdk路径 path---------------------->%JAVA_HOME%\bin;%JAV ...
- Python的那些坑--------括号篇
在Python中遇见了带不带括号的问题,我目前的是这三种,有问题请指出.如果有其他的,我后续会更新 一 函数带不带括号: def a(x): return x print(a) #不带括号调用的结果 ...
- You Probably Don’t Need a Message Queue
原文地址 I’m a minimalist, and I don’t like to complicate software too early and unnecessarily. And addi ...
- 一张图说docker
- 1113: [视频]树形动态规划(TreeDP)8:树(tree)(树形dp状态设计总结)
根据最近做的几道树形dp题总结一下规律.(从这篇往前到洛谷 P1352 ) 这几道题都是在一颗树上,然后要让整棵树的节点或边 满足一种状态.然后点可以影响到相邻点的这种状态 然后求最小次数 那么要从两 ...
- Edward Frenkel关于几何化朗兰兹纲领的采访
本文来自:菲尔兹奖座谈会 博客 Edward Frenkel教授的主要研究方向是数学与量子物理中的对称.他现在在做的许多问题都与朗兰兹纲领有关.他现在是加州大学伯克利分校的数学教授. 在今年的菲尔兹奖 ...
- 【BZOJ 1260】[CQOI2007]涂色paint
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 区间DP 设f[i][j]表示i..j这个区间变成目标需要的最少染色次数. f[i][i] = 1 然后考虑f[i][j]的产生方法 ...
- HTTP cookies 详解
http://blog.csdn.net/lijing198997/article/details/9378047