建造者模式

Posted yuemw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式相关的知识,希望对你有一定的参考价值。

1. 在C++中,如果在类的构造函数中调用虚函数时,使用的是静态绑定。
2. 建造者模式让对象的表示与构建相分离。
一、简介
建造者模式是当创建复杂对象的流程应该独立与该对象的组成部分以及他们的装配方式时适用的模式。本模式使得同样的构建过程可以创建不同的对象。
1. 优点:
1)隔离了构建的步骤和具体的实现,为产品的具体实现提供了灵活度。
2)封装和抽象了每个步骤的实现,实现了依赖倒转原则。
3)封装了具体的步骤,减少了代码的冗余。
2. 缺点:
1)要求构建产品的步骤(算法)是不能剧烈变化的,最好是不变的,这样就影响了灵活度。
二、结构图
以下为一张经典的建造者模式的结构类图:

 技术分享图片

  在图中,可以看到具体产品的建造顺序作为不变的部分,被封装在建造者的虚接口中,但是复杂多变的构建可以通过多态去处理。

三、示例

 

#ifndef Builder_h
#define Builder_h

class Car
{
public:
    Car();
    virtual ~Car() {};

    void            addWheel();
    void            addBody();
    void            addEngine();

    void            drive();
};

class BaseBuilder
{
public:
    BaseBuilder();
    virtual ~BaseBuilder();

    virtual            addCarWheel();
    virtual            addCarBody();
    virtual            addCarEngine();

    virtual Car        getCar();

private:

};

class BMWCarBuilder : public BaseBuilder
{
public:
    BMWCarBuilder() 
        : m_car(new Car)
    {};
    virtual ~BMWCarBuilder() {};

    virtual            addCarWheel() 
    {
        m_car->addWheel();
    };

    virtual            addCarBody()
    {
        m_car->addBody();
    };

    virtual            addCarEngine()
    {
        m_car->addEngine();
    };

    virtual Car        getCar() { return (*m_car); };

private:
    Car            *m_car;
};

class QQCarBuilder : public BaseBuilder
{
public:
    QQCarBuilder();
    virtual ~QQCarBuilder();

    virtual            addCarWheel()
    {
        m_car->addWheel();
    };

    virtual            addCarBody()
    {
        m_car->addBody();
    };

    virtual            addCarEngine()
    {
        m_car->addEngine();
    };

    virtual Car        getCar() { return (*m_car); };
private:
    Car            *m_car;
};

class BuilderManager
{
public:
    BuilderManager();
    virtual ~BuilderManager() {};

    void            productCar(BaseBuilder *builder)
    {
        if (nullptr != builder)
        {
            builder->addCarBody();
            builder->addCarWheel();
            builder->addCarEngine();
        }
    };
};

void main()
{
    BuilderManager manager;
    BMWCarBuilder *bmwBuilder = new BMWCarBuilder;
    QQCarBuilder *qqBuilder = new QQCarBuilder;

    manager.productCar(bmwBuilder);
    manager.productCar(qqBuilder);

    Car bmwCar = bmwBuilder->getCar();
    Car qqCar = qqBuilder->getCar();

    delete bmwBuilder;
    bmwBuilder = nullptr;

    delete qqBuilder;
    qqBuilder = nullptr;
}
#endif // !Builder_h

 












以上是关于建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式(Builder)

设计模式之建造者模式

第十三章-建造者模式

设计模式 创建者模式 -- 建造者模式

设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)

Java设计模式-建造者模式