关键词:
1、定义
1.1 标准定义
建造者模式( Builder Pattern) 也叫做生成器模式, 其定义如下:
Separate the construction of a complex object from its representation so that the same construction process can create different representations.( 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。 )
1.2 通用类图
在建造者模式中, 有如下4个角色:
● Product产品类
通常是实现了模板方法模式, 也就是有模板方法和基本方法, 参考模板方法模式。
● Builder抽象建造者
规范产品的组建, 一般是由子类实现。
● ConcreteBuilder具体建造者
实现抽象类定义的所有方法, 并且返回一个组建好的对象。
● Director导演类
负责安排已有模块的顺序。
2、实现
2.1 类图
Builder:定义创建对象过程的抽象,提供构建不同组成部分的接口
其中:BuildPartA,BuildPartB,BuildPartC是对一个对象不同部分的构建函数接口,由Builder的派生类ConcreteBuilder1、ConcreteBuilder2来具体实现。
另外还有一个需要注意的函数,就是Director::Construct函数,这个函数里面通过调用上面的接口函数完成对象的构建--也就是说各个不同部分装配的过程都是一致的(同样的调用的Construct函数),但是不同的构建方式会有不同的表示(根据Builder的实际类型来决定如何构建,也就是多态)。
Builder模式是基于这样的一个情况:一个对象可能有不同的组成部分,这几个部分的不同的创建对象会有不同的表示,但是各个部分之间装配的方式是一致的.比方说一辆单车,都是由车轮车座等等的构成的(一个对象不同的组成部分),不同的品牌生产出来的也不一样(不同的构建方式).虽然不同的品牌构建出来的单车不同,但是构建的过程还是一样的。
也就是说,Director::Construct函数中固定了各个组成部分的装配方式,而具体是装配怎样的组成部分由Builder的派生类实现.
2.2 代码
2.2.1 建造者
//builder.h #ifndef _BUILDER_H_ #define _BUILDER_H_ #include <string> #include <vector> using namespace std; //产品类 class Product { private: string m_partA; string m_partB; string m_partC; public: void setPartA(const string& s); void setPartB(const string& s); void setPartC(const string& s); Product(); ~Product(); }; //抽象Builder基类,定义不同部分的创建接口 class Builder { public: virtual void BuildPartA()=0; virtual void BuildPartB()=0; virtual void BuildPartC()=0; virtual Product* GetProduct()=0; Builder(); virtual ~Builder(); }; // Builder的派生类,实现BuilderPartA和BuilderPartB和BuildPartC接口函数 class ConcreteBuilder1:public Builder { public: ConcreteBuilder1(); ~ConcreteBuilder1(); virtual void BuildPartA(); virtual void BuildPartB(); virtual void BuildPartC(); virtual Product* GetProduct(); private: Product* m_pProduct; }; // Builder的派生类,实现BuilderPartA和BuilderPartB和BuildPartC接口函数 class ConcreteBuilder2:public Builder { public: ConcreteBuilder2(); ~ConcreteBuilder2(); virtual void BuildPartA(); virtual void BuildPartB(); virtual void BuildPartC(); virtual Product* GetProduct(); private: Product* m_pProduct; }; //ConcreteBuilder1与ConcreteBuilder2是Builder的两个派生类,用于实现两种不同的建造细节 // 使用Builder构建产品,构建产品的过程都一致,但是不同的builder有不同的实现 // 这个不同的实现通过不同的Builder派生类来实现,存有一个Builder的指针,通过这个来实现多态调用 class Director { public: Director(Builder* pBuilder); ~Director(); //Construct函数定义一个对象的整个构建过程,不同的部分之间的装配方式都是一致的, //首先构建PartA其次是PartB,只是根据不同的构建者会有不同的表示 void Construct(); //void Construct(const string& buildPara); private: Builder* m_pBuilder; }; #endif
//builder.cpp #include "Builder.h" #include <iostream> #include <vector> using namespace std; Product::~Product(){} Product::Product(){} void Product::setPartA(const string& s) { this->m_partA = s; } void Product::setPartB(const string& s) { this->m_partB = s; } void Product::setPartC(const string& s) { this->m_partC = s; } //-------------------------------------------- Builder::Builder(){} Builder::~Builder(){} //-------------------------------------------- ConcreteBuilder1::ConcreteBuilder1() { this->m_pProduct = new Product(); cout<<"Create empty product!"<<endl; } void ConcreteBuilder1::BuildPartA() { this->m_pProduct->setPartA("A"); cout<<"BuildPartA"<<endl; } void ConcreteBuilder1::BuildPartB() { this->m_pProduct->setPartB("B"); cout<<"BuildPartB"<<endl; } void ConcreteBuilder1::BuildPartC() { this->m_pProduct->setPartC("C"); cout<<"BuildPartC"<<endl; } Product* ConcreteBuilder1::GetProduct() { return this->m_pProduct; } ConcreteBuilder1::~ConcreteBuilder1() { delete this->m_pProduct; this->m_pProduct = NULL; } //-------------------------------------------- ConcreteBuilder2::ConcreteBuilder2() { this->m_pProduct = new Product(); cout<<"Create empty product!"<<endl; } void ConcreteBuilder2::BuildPartA() { this->m_pProduct->setPartA("A"); cout<<"BuildPartA"<<endl; } void ConcreteBuilder2::BuildPartB() { this->m_pProduct->setPartB("B"); cout<<"BuildPartB"<<endl; } void ConcreteBuilder2::BuildPartC() { this->m_pProduct->setPartC("C"); cout<<"BuildPartC"<<endl; } Product* ConcreteBuilder2::GetProduct() { return this->m_pProduct; } ConcreteBuilder2::~ConcreteBuilder2() { delete this->m_pProduct; this->m_pProduct = NULL; } //-------------------------------------------- Director::Director(Builder* pBuilder) { this->m_pBuilder = pBuilder; } void Director::Construct() { this->m_pBuilder->BuildPartA(); this->m_pBuilder->BuildPartB(); this->m_pBuilder->BuildPartC(); } Director::~Director() { delete this->m_pBuilder; this->m_pBuilder = NULL; }
2.2.3 调用
//main.cpp #include "Builder.h" #include <iostream> using namespace std; int main() { Director* pDirector = new Director(new ConcreteBuilder1()); pDirector->Construct(); Director* pDirector1 = new Director(new ConcreteBuilder2()); pDirector1->Construct(); delete pDirector; pDirector = NULL; delete pDirector1; pDirector1 = NULL; return 0; }
3、优缺点
● 封装性
使用建造者模式可以使客户端不必知道产品内部组成的细节。
● 建造者独立,
容易扩展
各个Builder是相互独立的, 对系统的扩展非常有利。
● 便于控制细节风险
由于具体的建造者是独立的, 因此可以对建造过程逐步细化,
而不对其他的模块产生任何影响。
4、使用场景
● 相同的方法, 不同的执行顺序, 产生不同的事件结果时, 可以采用建造者模式。
● 多个部件或零件,
都可以装配到一个对象中, 但是产生的运行结果又不相同时, 则可以使用该模式。
● 产品类非常复杂,
或者产品类中的调用顺序不同产生了不同的效能, 这个时候使用建造者模式非常合适。
5、Builder VS AbstractFactory
建造者模式最主要的功能是基本方法的调用顺序安排, 也就是这些基本方法已经实现了, 通俗地说就是零件的装配, 顺序不同产生的对象也不同; 而工厂方法则重点是创建, 创建零件是它的主要职责, 组装顺序则不是它关心的。
Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。
建造者模式(builder)
建造者模式(Builder)C#设计模式系列:建造者模式(Builder)建造者模式(BuilderPattern) 状态模式C#设计模式——状态模式(StatePattern) 查看详情
设计模式——建造者模式
设计模式(五)——建造者模式一、建造者模式简介1、建造者模式简介 建造者模式将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式和抽象工厂模式... 查看详情
设计模式之————建造者模式
建造者模式1.什么是建造者模式?建造者模式属于创造型模式,它是将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。举例:普通房子和高楼,两者都很难建造,但也有相似点:打地... 查看详情
设计模式之建造者模式(创建型)(代码片段)
模式定义建造者模式属于23种设计模式中的创建型模式,可以理解为创建对象的一种很好的方法。所谓建造者模式就是将组件和组件的组件过程分开,然后一步一步建造一个复杂的对象。所以建造者模式又叫生成器模式。建造者... 查看详情
设计模式建造者模式(简介|适用场景|优缺点|代码示例)(代码片段)
文章目录一、建造者模式简介二、建造者模式适用场景三、建造者模式优缺点四、建造者模式与工厂模式五、建造者模式代码示例1、学生类2、建造者抽象类3、建造者实现类4、教师类(非必须)5、测试类六、实例类和建造者类定... 查看详情
设计模式—建造者模式(builder)(代码片段)
title:设计模式—建造者模式建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。我们获得一... 查看详情
java设计模式-建造者模式
建造者模式概述建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如... 查看详情
设计模式之建造者模式
1定义建造者模式(BuilderPatten):将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式用于一步一步创建一个复杂的对象,他允许用户只通过指定复杂对象的类型和内容进行构建,用户... 查看详情
设计模式建造者模式
建造者模式建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在建造事物时,如果发现事物的内部建造的顺序是保持不变的,并且多个事物之间的建造过程也是一致的那么就可以使... 查看详情
大话设计模式-建造者模式(代码片段)
建造者模式建造者模式又称生成器模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式主要用于创建一些复杂的对象,这些对象内部构构建间的构造顺序通常是稳定的,但对象内... 查看详情
设计模式:学习笔记——建造者模式
设计模式:学习笔记(4)——建造者模式概述建造者模式 建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只... 查看详情
设计模式——建造者模式
分类设计模式总体划分为三大类:创建型模式:工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式模式,共5种。结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式,共7中... 查看详情
设计模式—建造者模式
1建造者模式 将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者返回给客户一个完整的产品对象,而客户端无须关心该对象所包含的属性和组建方式,这就是建造者模式的设... 查看详情
设计模式——建造者模式(代码片段)
设计模式(九)——建造者模式新专题:设计模式,我会在博客(http://www.hollischuang.com)及微信公众号(hollischuang)同步更新,欢迎共同学习。本文主要介绍创建型模式的最后一种————建造者模式。概念建造者模式(英:BuilderPatt... 查看详情
java设计模式3.建造者模式原型模式
建造者模式一个产品常有不同的组成部分作为产品的零件,有些情况下,一个对象会有一些重要的性质,在它们没有恰当的值之前,对象不能作为一个完整的产品使用,有些时候,一个对象的一些性质必须按照某个顺序赋值才有... 查看详情
建造者模式
设计模式之建造者设计模式(也叫生成器模式)建造者模式就是将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示1:使用建造者模式的话,它封装了一个产品的构造过程,并且允许按照预定的步骤构... 查看详情
设计模式——建造者模式(代码片段)
什么是建造者建造者模式实际上是常用的设计模式。顾名思义,builder的意思是建造者或者建筑工人,谈到建造自然会想到楼房。楼房是千差万别的,楼房的外形、层数、内部房间的数量、房间的装饰等等都不一样,但是对于建... 查看详情
建造者模式
建造者模式的定义建造者模式(BuilderPattern)也叫做生成器模式,其定义如下:Separatetheconstructionofacomplexobjectfromitsrepresentationsothatthesameconstructionprocesscancreatedifferentrepresentations.(将一个复杂对象的构建与它的表示分离,使得同样... 查看详情