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

2020-04-28  本文已影响0人  阿棍儿_Leon

接着设计模式-创建模式-三种工厂模式总结,考虑一个有更多属性的对象。在工厂模式种,一个对象在被构造时可能需要很多的构造参数,或者在刚new出来对象之后,还不算是完全体,还需要很多的属性设置步骤,对于这种情况,可以换一种思路来考虑。对于一个复杂的对象,用类区分会非常吃力,那不如完全用复杂的属性来区分,这样我们就可以考虑使用建造者模式。
对应工厂模式的概念,建造者模式首先有一个产品的原型,从原型到产品的过程就是对各种属性的设置过程。这样,一个产品就对应了一套特定的设置,一套特定的设置方法就对应一个建造器。在本文建造者模式的演示中,为了更有一般性,建造的对象是一个物体。这里面还有一个角色就是用建造器进行建造的建造者。

以下代码定义了物体类。这种物体有2个部分,每个部分有2种风格。

#include <iostream>

using namespace std;

enum Part0Style
{
    Part0Style0,
    Part0Style1,
};
enum Part1Style
{
    Part1Style0,
    Part1Style1,
};
class Object
{
private:
    Part0Style part0Style;
    Part1Style part1Style;
public:
    void SetPart0(Part0Style style)
    {
        part0Style = style;
    }
    void SetPart1(Part1Style style)
    {
        part1Style = style;
    }
    void Display(void)
    {
        cout<<"Part0 style="<<part0Style<<",Part1 style="<<part1Style<<endl;
    }
};

以下代码定义了一个建造器抽象类,子类必须分别实现建造物体两部分的具体风格。

class Builder
{
public:
    virtual void BuildPart0()=0;
    virtual void BuildPart1()=0;
    virtual Object* GetObject()=0;
};

以下代码分别定义了两个建造器,分别是专门用于建造“第一部分是风格0,第二部分是风格1”的物体和“第一部分是风格1,第二部分是风格0”的物体的。

class Object01Builder:public Builder
{
private:
    Object* m_pObject;
public:
    Object01Builder():m_pObject(new Object()){}
    void BuildPart0()
    {
        m_pObject->SetPart0(Part0Style0);
    }
    void BuildPart1()
    {
        m_pObject->SetPart1(Part1Style1);
    }
    Object* GetObject()
    {
        return m_pObject;
    }
};
class Object10Builder:public Builder
{
private:
    Object* m_pObject;
public:
    Object10Builder():m_pObject(new Object()){}
    void BuildPart0()
    {
        m_pObject->SetPart0(Part0Style1);
    }
    void BuildPart1()
    {
        m_pObject->SetPart1(Part1Style0);
    }
    Object* GetObject()
    {
        return m_pObject;
    }
};

以下代码定义了建造者,它执掌着一个建造器进行建造工作。

class Director
{
private:
    Builder* m_pBuilder;
public:
    Director(Builder* builder):m_pBuilder(builder){}
    void BuildObject()
    {
        m_pBuilder->BuildPart0();
        m_pBuilder->BuildPart1();
    }
};

以下代码是对建造者模式的使用。基本套路是,先new一个特定风格的建造器,再用它new一个建造者,建造者执行建造任务后,用户可以从建造器中拿到建造完成的物体对象,最后对物体进行一次使用(调用Display)。

int main(void)
{
    Builder* builder = new Object01Builder();
    Director* director = new Director(builder);
    director->BuildObject();
    Object *object = builder->GetObject();
    object->Display();
    delete director;
    delete builder;
    delete object;

    builder = new Object10Builder();
    director = new Director(builder);
    director->BuildObject();
    object = builder->GetObject();
    object->Display();
    delete director;
    delete builder;
    return 0;
}

输出

Part0 style=0,Part1 style=1
Part0 style=1,Part1 style=0
上一篇下一篇

猜你喜欢

热点阅读