设计模式学习--建造者模式

建造者模式属于对象创建型模式,也可叫做是生成器模式,建造者模式的结构如下图:
建造者模式的结构图
如图可以看出,建造者模式主要有生成器(Director),抽象建造者(Builder),具体建造者(ConcreteBuilderA,ConcreteBuilderB),产品类(ProductA,ProductB)组成。各个参与者主要的作用:
生成器:构造一个使用Builder接口的对象
抽象建造者:为创建一个Product对象的各个部件抽象接口
具体建造者:1 实现Builder的接口装配产品的各个组件
2 定义并明确他创建的表示
3 提供一个检索产品的接口(getResult)
产品类:1 表示被构建的复杂对象,具体建造者创建该产品的内部表示和定义它的装配过程
2 包含定义组成部件的类,包括将这些组件装配成最终产品的接口
建造者模式的流程:1 客户创建Director对象,并使用适当的Builder进行配置
2 一旦产品部件被生产,导向器会通知生成器
3 生成器处理导向器的请求,并将该部件加入到产品中
4 客户通过检索的接口,检索生成的最终产品
一句话概述就是:建造者模式,将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用建造者模式的优势在与:
1 用户只需要指定需要构建的类型就可以使用,而不需要具体构建构成的细节
2 他可以使你改变的产品的内部表示,当你需要更改产品的内部表示时,只需添加一个建造者就可以了
3 构建代码和表示代码解耦,可以轻松复用构建者的代码
4 让你对构建过程的代码可以进行精细的控制,从而可以更精细的控制产品的内部结构
不过要注意的是实现Builder类的时候,接口必须要足够的普遍,一边满足不同具体产品的构建
一下以更具体的例子来说明(小人不才,就使用了大话设计模式里面的例子

//客户调用的方法
Director* director = new Director();
//构建瘦子
PersonBuilder* tbuilder = new ThinBuilder();
director->createPerson(tbuilder);
Person* tpersion = tbuilder->getPerson();
tpersion->showPerson();
//构建胖子
PersonBuilder* fbuilder = new FatBuilder();
director->createPerson(fbuilder);
Person* fpersion = fbuilder->getPerson();
fpersion->showPerson();
//接下来是导向器的实现
#include "Director.h"
Director::Director()
{
}

Director::~Director()
{
}
//具体的构建过程
void Director::createPerson(PersonBuilder* builder)
{
    builder->buildArmLeft();
    builder->buildArmRight();
    builder->buildHead();
    builder->buildLegLeft();
    builder->buildLegRight();
}
接下来是抽象构建者
/************************************************************************
            @fileName: PersonBuilder.h 
            @function: 建造者模式中抽象建造类
            @author: jaime
            @ver: 1.0.0
************************************************************************/
#pragma once
#include "Person.h"
class PersonBuilder
{
public:
    PersonBuilder();
    ~PersonBuilder();
    virtual void buildHead();
    virtual void bulldBody();
    virtual void buildArmLeft();
    virtual void buildArmRight();
    virtual void buildLegLeft();
    virtual void buildLegRight();
    virtual Person* getPerson();
private:

};
//瘦子的构建类
#include "ThinBuilder.h"

ThinBuilder::ThinBuilder()
:m_person(new Person())
{
}

ThinBuilder::~ThinBuilder()
{
    delete m_person;
}

void ThinBuilder::buildArmLeft()
{
    m_person->addPart("瘦子的左手");
}

void ThinBuilder::buildArmRight()
{
    m_person->addPart("瘦子的右手");
}

void ThinBuilder::buildHead()
{
    m_person->addPart("瘦子的头");
}

void ThinBuilder::buildLegLeft()
{
    m_person->addPart("瘦子的左手");
}

void ThinBuilder::buildLegRight()
{
    m_person->addPart("瘦子的右脚");
}

Person* ThinBuilder::getPerson()
{
    return m_person;
}
//胖子的构建类
#include "FatBuilder.h"

FatBuilder::FatBuilder()
:m_persion(new Person())
{

}

FatBuilder::~FatBuilder()
{
    delete m_persion;
}

void FatBuilder::buildArmLeft()
{
    m_persion->addPart("胖子的左手");
}

void FatBuilder::buildArmRight()
{
    m_persion->addPart("胖子的右手");
}

void FatBuilder::buildHead()
{
    m_persion->addPart("胖子的头");
}

void FatBuilder::buildLegLeft()
{
    m_persion->addPart("胖子的左脚");
}

void FatBuilder::buildLegRight()
{
    m_persion->addPart("胖子的右脚");
}

Person* FatBuilder::getPerson()
{
    return m_persion;
}
//产品的实现
#include "Person.h"
Person::Person()
{
}

Person::~Person()
{
}

void Person::addPart(string part)
{
    this->m_partVec.push_back(part);
}

void Person::showPerson()
{
    vector<string>::iterator it = this->m_partVec.begin();
    while ( it != this->m_partVec.end() )
    {
        cout << "" << *it << endl;
        it++;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值