美文网首页
设计模式-创建模式-建造者模式

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

作者: 阿棍儿_Leon | 来源:发表于2020-04-28 19:03 被阅读0次

    接着设计模式-创建模式-三种工厂模式总结,考虑一个有更多属性的对象。在工厂模式种,一个对象在被构造时可能需要很多的构造参数,或者在刚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
    

    相关文章

      网友评论

          本文标题:设计模式-创建模式-建造者模式

          本文链接:https://www.haomeiwen.com/subject/zxubwhtx.html