【设计模式】建造者模式

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();

    return 0;
}

3、优缺点

● 封装性

使用建造者模式可以使客户端不必知道产品内部组成的细节。

● 建造者独立,
容易扩展

各个Builder是相互独立的, 对系统的扩展非常有利。

● 便于控制细节风险

由于具体的建造者是独立的, 因此可以对建造过程逐步细化,
而不对其他的模块产生任何影响。

4、使用场景

● 相同的方法, 不同的执行顺序, 产生不同的事件结果时, 可以采用建造者模式。

● 多个部件或零件,
都可以装配到一个对象中, 但是产生的运行结果又不相同时, 则可以使用该模式。

● 产品类非常复杂,
或者产品类中的调用顺序不同产生了不同的效能, 这个时候使用建造者模式非常合适。

● 在对象创建过程中会使用到系统中的一些其他对象,
这些对象在产品对象的创建过程中不易得到时, 也可以采用建造者模式封装该对象的创建过程。
该种场景只能是一个补偿方法, 因为一个对象不容易获得,
而在设计阶段竟然没有发觉, 而要通过创建者模式柔化创建过程, 本身已经违反设计的最初目标。

5、Builder VS AbstractFactory

建造者模式最主要的功能是基本方法的调用顺序安排, 也就是这些基本方法已经实现了,
通俗地说就是零件的装配, 顺序不同产生的对象也不同; 而工厂方法则重点是创建,
创建零件是它的主要职责, 组装顺序则不是它关心的。

Builder模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的结果对象,一般来说Builder模式中对象不是直接返回的。而在AbstractFactory模式中对象是直接返回的,AbstractFactory模式强调的是为创建多个相互依赖的对象提供一个同一的接口。

时间: 2024-08-22 22:26:37

【设计模式】建造者模式的相关文章

设计模式—建造者模式(Builder)

title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对象创建型模式.我们获得一个对象的时候不是直接new这个对象出来,而是对其建造者进行属性设置,然后建造者在根据设置建造出各个对象出来.建造者模式又可以称为生成器模式. 模式结构 一个标准的建造者模式包含如下角色: Builder:抽象建造者 ConcreteBuilder:具体建造者 Director

小菜学设计模式——建造者模式

背景 不要小看炒菜这件小事上,想要上一道佳肴,那是需要循规蹈矩,步步小心的.我相信你肯定在外面吃过没放盐的快餐,吃过放多了盐的快餐.....既然炒菜是一个如此复杂的过程,又必须循规蹈矩,那为什么不给他一个死规定呢?如果谁没有按照规定做事,就进行对应的提醒警告.这就是建造者模式的由来,限制规则步骤,但是开发规则细节.比如说盛菜之前必须放盐,那么规定一定要放盐,具体放多少自己论情况而定. 1.使用意图 如果你需要将一个复杂对象的构建与它的表示(构建具体过)分离,使得同样的构建过程可以创建不同的表示的

设计模式——建造者模式

HeadFirst中并没有把建造者模式(生成器模式)当做常用的设计模式来讲解,只是在附录中一带而过. 建造者模式的本质:       分离了对象组件的单独构造(由Builder来负责)和装配(由Director)来负责.从而可以构建出复杂的对象.这个模式适用于:某个对象的构建       过程复杂的情况先使用.由于实现了构建和装配的解耦.不同的构建器,相同的装配,也可以做出不同的对象相同的构建器不同的装配顺序也可以 做出不同的对象.也就是实现了构建算法.装配算法的解耦,实现了更好的复用. Dem

C#设计模式——建造者模式(Builder Pattern)

1.建造者模式简介 1.1>.定义 建造者模式(Builder)将复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 1.2>.使用频率  中低 1.3>.原型模式应用 在软件系统中,有时候面临一个复杂对象的创建工作,该对象通常由各个部分子对象用一定的算法构成,或者按一定的步骤组合而成:这些算法和步骤是稳定的,而构成这个对象的子对象却经常由于需求的变化而不断变化. 生活中的例子,要组装一台电脑,它的组装过程基本是不变的,都可以由主板.CPU.内存等按照某个稳定方式组合而成.

C#设计模式-建造者模式

在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由CPU.主板.硬盘.显卡.机箱等组装而成的,如果此时让采购员一台一台电脑去组装的话真是要累死采购员了,这里就可以采用建造者模式来解决这个问题,我们可以把电脑的各个组件的组装过程封装到一个建造者类对象里,建造者只要负责返还给客户端全部组件都建造完毕的产品对象就可以了.然而现实生活中也是如此的,如果公司要

Java设计模式——建造者模式

建造者模式(Builder Pattern)属于创建形的设计模式,使用多个简单的对象一步一步构建成一个复杂的对象. 主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成:由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定. 何时使用:一些基本部件不会变,而其组合经常变化的时候. 应用实例: 1.去肯德基,汉堡.可乐.薯条.炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的&quo

Python设计模式——建造者模式

需求,画人物,要求画一个人的头,左手,右手,左脚,右脚和身体,画一个瘦子,一个胖子 不使用设计模式 #encoding=utf-8 __author__ = '[email protected]' if __name__=='__name__': print '画左手' print '画右手' print '画左脚' print '画右脚' print '画胖身体' print '画左手' print '画右手' print '画左脚' print '画右脚' print '画瘦身体' 这样写的

php设计模式 — 建造者模式

需求分析: 我们接到了一个订单,是宝马公司和奔驰公司的,他们负责定义产品的零部件以及型号,我们负责生产,需求简单的描述就是这样. 我们需要为这个需求设计一个设计模式去更好的适应他们的需求. 首先我们需要一个车模型类,来定义好需要的所有零部件,这就叫做抽象类,之所以这样是因为我们还有可能接到更多公司的订单,比如劳斯莱斯,宾利. 然后由各自的车来继承这个抽象类,实现里面的方法. 接下来就需要一个建造者抽象类,来定义建造各自的车需要的方法 然后由各自车建造者来继承这个抽象类. 我们会想到一个建造模式了

C++设计模式——建造者模式

建造者模式 在GOF的<设计模式 可复用面向对象软件的基础>中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 这句话,似懂非懂的.一个复杂对象的创建,其通常是由很多的子对象构成:如果一个对象能够直接就创建好了,那么也不会称之为复杂对象.由于项目中需求的变化,这个复杂对象的各个部分经常会发生剧烈的变化,但是,不管怎么变化,将它们组合在一起,组成一个复杂的对象的事实是不会变的.建造者模式就提供了一种“封装机制”来将各个对象的变化隔离开,最终,组合成复杂对象的

PHP设计模式——建造者模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 例如:汽车,他的发动机引擎有好多品牌,轮胎也有各种材质,内饰更是千奇百怪:鸟,他的头.翅膀以及脚有各种颜色和形状,在创建这种复杂对象的时候,我们建议使用建造者模式. 类图: 建造者模式一般认为有四个角色: 1.产品角色,产品角色定义自身的组成属性 2.抽象建造者,抽象建造者定义了产品的创建过程以及如何