设计模式之建造者模式(生成器模式、Builder)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。
创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式);5、Prototype(原型模式).
结构型模式包括:6、Bridge(桥接模式);7、Adapter(适配器模式);8、Decorator(装饰模式);9、Composite(组合模式);10、Flyweight(享元模式);11、Facade(外观模式);12、Proxy(代理模式).
行为模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(状态模式);16、Observer(观察者模式);17、Memento(备忘录模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(访问者模式);21、Chain of Responsibility(责任链模式);22、Iterator(迭代器模式);23、Interpreter(解释器模式).
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Proxy:为其他对象提供一个代理以控制对这个对象的访问。
Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Builder: (1)、意图:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;(2)、适用性:当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时;当构造过程必须允许被构造的对象有不同的表示时;
Abstract Factory与Builder相似,因为它也可以创建复杂对象,主要的区别是Builder模式着重于一步步构造一个复杂对象。而AbstractFactory着重于多个系列的产品对象(简单的或是复杂的).Builder在最后的一步返回产品,而对于AbstractFactory来说,产品是立即返回的。Composite通常是用Builder生成的。
示例代码1:
#include <string>
#include <iostream>
#include <vector>using namespace std;//最终的产品类
class Product
{
private:vector<string> m_product;
public:void Add(string strtemp){m_product.push_back(strtemp);}void Show(){vector<string>::iterator p = m_product.begin();while (p != m_product.end()) {cout<<*p<<endl;p ++;}}
};//建造者基类
class Builder
{
public:virtual void BuilderA() = 0;virtual void BuilderB() = 0;virtual Product* GetResult() = 0;
};//第一种建造方式
class ConCreteBuilder1 : public Builder
{
private:Product* m_product;
public:ConCreteBuilder1(){m_product = new Product();}virtual void BuilderA(){m_product->Add("one");}virtual void BuilderB(){m_product->Add("two");}virtual Product* GetResult(){return m_product;}
};//第二种建造方式
class ConcreteBuilder2 : public Builder
{
private:Product* m_product;
public:ConcreteBuilder2(){m_product = new Product();}virtual void BuilderA(){m_product->Add("A");}virtual void BuilderB(){m_product->Add("B");}virtual Product* GetResult(){return m_product;}
};//指挥者类
class Direct
{
public:void Construct(Builder* temp){temp->BuilderA();temp->BuilderB();}
};//客户端
int main()
{Direct* p = new Direct();Builder* b1 = new ConCreteBuilder1();Builder* b2 = new ConcreteBuilder2();p->Construct(b1);//调用第一种方式Product* pb1 = b1->GetResult();pb1->Show();p->Construct(b2);//调用第二种方式Product* pb2 = b2->GetResult();pb2->Show();/* result:onetwoAB*/return 0;
}
示例代码2:
#include <string>
#include <iostream>
#include <vector>using namespace std;class Person
{
public:virtual void CreateHead() = 0;virtual void CreateHand() = 0;virtual void CreateBody() = 0;virtual void CreateFoot() = 0;
};class ThinPerson : public Person
{
public:virtual void CreateHead(){cout<<"thin head"<<endl;}virtual void CreateHand(){cout<<"thin hand"<<endl;}virtual void CreateBody(){cout<<"thin body"<<endl;}virtual void CreateFoot(){cout<<"thin foot"<<endl;}
};class ThickPerson : public Person
{
public:virtual void CreateHead(){cout<<"ThickPerson head"<<endl;}virtual void CreateHand(){cout<<"ThickPerson hand"<<endl;}virtual void CreateBody(){cout<<"ThickPerson body"<<endl;}virtual void CreateFoot(){cout<<"ThickPerson foot"<<endl;}
};//指挥者类
class Direct
{
private:Person* p;
public:Direct(Person* temp) {p = temp;}void Create(){p->CreateHead();p->CreateHand();p->CreateBody();p->CreateFoot();}
};//客户端代码
int main()
{Person* p = new ThickPerson();Direct* d = new Direct(p);d->Create();delete d;delete p;/*result:ThickPerson headThickPerson handThickPerson bodyThickPerson foot*/return 0;
}
示例代码3:
product.h:
#ifndef _PRODUCT_H_
#define _PRODUCT_H_class Product
{
public:Product();~Product();void ProducePart();
protected:
private:
};class ProductPart
{
public:ProductPart();~ProductPart();ProductPart* BuildPart();
protected:
private:
};#endif//~_PRODUCT_H_
product.cpp:
#include "product.h"
#include <iostream>
using namespace std;Product::Product()
{ProducePart();cout<<"return a product"<<endl;
}Product::~Product()
{}void Product::ProducePart()
{cout<<"build part of product ..."<<endl;
}ProductPart::ProductPart()
{cout<<"build productpart ..."<<endl;
}ProductPart::~ProductPart()
{}ProductPart* ProductPart::BuildPart()
{return new ProductPart;
}
builder.h:
#ifndef _BUILDER_H
#define _BUILDER_H#include <string>
using namespace std;class Product;class Builder
{
public:virtual ~Builder();virtual void BuildPartA(const string& buildPara) = 0;virtual void BuildPartB(const string& buildPara) = 0;virtual void BuildPartC(const string& buildPara) = 0;virtual Product* GetProduct() = 0;
protected:Builder();
private:
};class ConcreteBuilder : public Builder
{
public:ConcreteBuilder();~ConcreteBuilder();void BuildPartA(const string& buildPara);void BuildPartB(const string& buildPara);void BuildPartC(const string& buildPara);Product* GetProduct();
protected:
private:
};#endif//~_BUILDER_H
builder.cpp:
#include "builder.h"
#include "product.h"#include <iostream>
using namespace std;Builder::Builder()
{}Builder::~Builder()
{}ConcreteBuilder::ConcreteBuilder()
{}ConcreteBuilder::~ConcreteBuilder()
{}void ConcreteBuilder::BuildPartA(const string& buildPara)
{cout<<"Step1:Build PartA ..."<<buildPara<<endl;
}void ConcreteBuilder::BuildPartB(const string& buildPara)
{cout<<"Step1:Build PartB ..."<<buildPara<<endl;
}void ConcreteBuilder::BuildPartC(const string& buildPara)
{cout<<"Step1:Build PartC ..."<<buildPara<<endl;
}Product* ConcreteBuilder::GetProduct()
{BuildPartA("pre-defined");BuildPartB("pre-defined");BuildPartC("pre-defined");return new Product();
}
director.h:
#ifndef _DIRECTOR_H_
#define _DIRECTOR_H_class Builder;class Director
{
public:Director(Builder* bld);~Director();void Construct();protected:
private:Builder* _bld;
};#endif//~_DIRECTOR_H_
director.cpp:
#include "director.h"
#include "builder.h"Director::Director(Builder* bld)
{_bld = bld;
}Director::~Director()
{}void Director::Construct()
{_bld->BuildPartA("user-defined");_bld->BuildPartB("user-defined");_bld->BuildPartC("user-defined");
}
main.cpp:
#include "builder.h"
#include "product.h"
#include "director.h"#include <iostream>
using namespace std;int main()
{Director* d = new Director(new ConcreteBuilder());d->Construct();/*result:Step1:Build PartA ...user-definedStep1:Build PartB ...user-definedStep1:Build PartC ...user-defined*/return 0;
}
建造者模式结构图:
参考文献:
1、《大话设计模式C++》
2、《设计模式精解----GoF23种设计模式解析》
3、《设计模式----可复用面向对象软件的基础》
设计模式之建造者模式(生成器模式、Builder)摘录相关推荐
- 设计模式(4)建造者模式/生成器模式(Builder)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...
- 建造者模式 生成器模式 创建型 设计模式(五)
建造者模式 Builder 也叫做生成器模式 在正式开始建造者模式之前,先回顾下抽象工厂模式 本人的所有系列文章都是自己学习的记录过程,均有比较严格的先后顺序,如果不清楚抽象工厂模式可以先往前翻翻 从 ...
- 23种设计模式(4)-生成器模式
定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.生成器模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的对象. 四个要素: Build ...
- 创造型模式-生成器模式
生成器模式:能够从简单的对象一步一步生成复杂的对象,生成器模式是一种用来逐步构建复杂对象并在最后一步返回对象的创造型模式.构造一个对象的过程是通过泛型实现的,以便它能够用于对同一个对象创建不同的表示形 ...
- .Net 设计模式进阶之路——生成器模式[Builder]
「本文是月更第1天文章.对我来说,这是一个挑战,虽然很早就读过设计模式,但已经还回给了书本,这次拿来无非是想挑战下自己的输出能力,加油,webmote」
- C#设计模式——生成器模式(Builder Pattern)
一.概述 在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封 ...
- 【设计模式】单例模式-生成器模式-原型模式
前面的几种工厂模式,主要用于选择实现,这里的三种模式:单例模式.生成器模式.原型模式,主要用于生成对象,在GoF的划分中,这是创建型的五种模式(不包括简单工厂,前面提到过,这不是一个标准意义上的设计模 ...
- 设计模式(Java随笔)—生成器模式
生成器模式(Builder Pattern):分离构建算法和具体的构造实现,从而使构建算法可以重用 Separate the construction of a complex object from ...
- JAVA23种设计模式之生成器模式
生成器模式 生成器模式是一种对象的创建模式,可以将一个复杂产品的内部表象和产品的生产过程分隔开来,(构建与表示分离).使得同样的构建过程可以创建不同的表示. 简单的来说,就是讲一个复杂的对象拆分成一个 ...
最新文章
- PCL安装与环境变量配置(Win10)
- idea使用maven-archetype-webapp方式创建web工程
- .net随笔-vb.net打开外部程序发送键盘信号(2)
- oracle12c导11g,Oracle12c的数据库如何向11g导入
- debian下面的apt-fast安装
- 微服务模式下,实现前后端多资源服务调用
- 问君能有几多愁,恰似不懂Linux SQL如何调优——聊聊SQL Server on Linux最佳实践
- MySQL性能优化(来源于简书)
- 水逆的 Google,或许应该向百度取个经?
- 用glew,glfw实现opengl学习笔记5课纹理(2)
- 送给女朋友的情人节礼物---超贴心小程序
- dapper--查询超时时间
- 竞赛分享-自动文摘(bytecup 2018)
- PTA:运算符重载(最简分数,c++)
- 微信小程序请求函数的封装
- 小狗钱钱:钱钱的金钱语录
- 浅谈CPU位数和操作系统位数
- 什么是嵌入式?嵌入式技术应用领域
- Pycharm导入conda虚拟环境时报错error code:1
- Dubbo的原理,面试常见问题
热门文章
- 70种芯片细分领域、国产MCU重要代表企业
- 4行Python代码生成图像验证码
- html脚本语言居中,web前端:CSS--几种常用的水平垂直居中对齐方法
- 三、python中最基础的文件处理汇总
- LeetCode刷题记录13——705. Design HashSet(easy)
- linux 内存居高不下,Linux 内存占用总是很高为何依旧很流畅?
- 《概率机器人》里程计运动模型gmapping中代码解析
- 强大的矩阵奇异值分解(SVD)和特征值及其应用
- Udacity机器人软件工程师课程笔记(十二)-ROS-编写更复杂的ROS节点(arm_mover节点 和 look_away 节点)
- 在CentOS 6.8 x86_64上利用devtoolset搭建GCC 4.9.2和5.3.1开发环境