美文网首页设计模式 BY C++程序员C++设计模式
【C++ 设计模式】4. 建造者模式

【C++ 设计模式】4. 建造者模式

作者: JeremyYv | 来源:发表于2019-10-13 20:48 被阅读0次
    • 建造者模式:一种创建型设计模式


    • 应用场景:

      某类对象的构建过程由多步组成,各步执行细节一直变化,但是所有步骤间的组合关系不变。

      举例:

      要画一个图形,分为画形状和填色两步,这两步固定不会变,但是具体画的形状与颜色会随着需求而经常变化。

      每次形状与颜色的需求变更时,为了不更改原本类的代码,而是通过扩展新类的方式完成,可以通过构建一个建造者,该建造者只能满足某次需求的要求构建出图形(类似于特定的画笔,只能画出来绿色圆或红色三角),然后在需求变更时扩展出一个新的建造者即可。

    • 实现方式:

      首先,构建要被构造出来的图形类,并向外部提供能修改该图形类各组成部分的接口;

      然后,构建建造者的抽象类,所有派生的建造者根据自身作用重写接口,返回不同的图形对象;

      最后,构建一个导演类,导演类对象可根据设定的不同构建者,获得不同的图形对象。

    • 优点:

      将一个复杂对象的构建与它的表示分离,相同的构建过程可以创建不同的表示。
      有新的表示可以遵循开放封闭原则,扩展新的类代码完成需求。

    • 缺点:

      如果构建步骤发生添加或删除,所有建造者类都需要更改代码。


    以下是建造者模式的简易代码实现
    #include <iostream>
    using namespace std;
    
    // 要构建的对象
    class Graphic {
    public:
        Graphic() {}
    
        // 常变属性的设置接口
        void SetShape(string strShape) {
            m_strShape = strShape;
        }
    
        void SetColor(string strColor) {
            m_strColor = strColor;
        }
    
        // 图形的验证方法
        void Show() {
            cout << m_strColor << m_strShape << endl;
        }
    
    private:
        string m_strShape;
        string m_strColor;
    };
    
    //建造者抽象类
    class Builder {
    public:
        Builder(): m_pGraphic(NULL) {}
    
        // 创建空白图形
        void CreateGraphic() {
            if (NULL == m_pGraphic) {
                m_pGraphic = new Graphic();
            }
        }
    
        // 获取描绘完成的图形
        Graphic* GetGraphic() {
            return m_pGraphic;
        }
    
        // 留给派生类实现的描绘过程
        virtual void DrawShape() = 0;
        virtual void DrawColor() = 0;
    
    protected:
        Graphic* m_pGraphic;
    };
    
    class GreenCircleBuilder: public Builder {
    public:
        // 根据类的功能实现描绘过程
        void DrawShape() {
            if (NULL != m_pGraphic) {
                m_pGraphic->SetShape("Circle");
            }
        }
    
        void DrawColor() {
            if (NULL != m_pGraphic) {
                m_pGraphic->SetColor("Green");
            }
        }
    };
    
    class RedRectangleBuilder: public Builder {
    public:
        // 根据类的功能实现描绘过程
        void DrawShape() {
            if (NULL != m_pGraphic) {
                m_pGraphic->SetShape("Rectangle");
            }
        }
    
        void DrawColor() {
            if (NULL != m_pGraphic) {
                m_pGraphic->SetColor("Red");
            }
        }
    };
    
    class BlueTriangleBuilder: public Builder {
    public:
        // 根据类的功能实现描绘过程
        void DrawShape() {
            if (NULL != m_pGraphic) {
                m_pGraphic->SetShape("Triangle");
            }
        }
    
        void DrawColor() {
            if (NULL != m_pGraphic) {
                m_pGraphic->SetColor("Blue");
            }
        }
    };
    
    // 导演类
    class Director {
    public:
        Director(): m_pBuilder(NULL) {}
    
        // 根据需求设置对应的建造者
        void SetBuilder(Builder& pBuilder) {
            m_pBuilder = &pBuilder;
        }
    
        // 通过建造者获得描绘完成的图形
        Graphic* DrawGraphic() {
            if (NULL == m_pBuilder) {
                return NULL;
            }
            //建造过程为不变的因素
            m_pBuilder->CreateGraphic();
            m_pBuilder->DrawShape();
            m_pBuilder->DrawColor();
            return m_pBuilder->GetGraphic();
        }
    
    private:
        Builder* m_pBuilder;
    };
    
    主函数中的使用
    #include <iostream>
    #include "builder.hpp"
    using namespace std;
    
    int main()
    {
        Director MyDirector;
        // 根据导演的不同需求,分别设置不同的建造者,获得满足需求的图形
        GreenCircleBuilder BuilderGC; // 绿色圆形的建造者
        MyDirector.SetBuilder(BuilderGC);
        Graphic* pGraphicGC = MyDirector.DrawGraphic(); // 导演使用建造者画图
        pGraphicGC->Show();
    
        RedRectangleBuilder BuilderRB; // 红色矩形的建造者
        MyDirector.SetBuilder(BuilderRB);
        Graphic* pGraphicRB = MyDirector.DrawGraphic(); // 导演使用建造者画图
        pGraphicRB->Show();
    
        BlueTriangleBuilder BuilderBT; // 蓝色三角的建造者
        MyDirector.SetBuilder(BuilderBT);
        Graphic* pGraphicBT = MyDirector.DrawGraphic(); // 导演使用建造者画图
        pGraphicBT->Show();
    
        // 资源回收
        if (NULL == pGraphicGC) {
            delete pGraphicGC;
            pGraphicGC = NULL;
        }
        if (NULL == pGraphicRB) {
            delete pGraphicRB;
            pGraphicRB = NULL;
        }
        if (NULL == pGraphicBT) {
            delete pGraphicBT;
            pGraphicBT = NULL;
        }
        return 0;
    }
    
    控制台输出结果
    GreenCircle
    RedRectangle
    BlueTriangle
    

    相关文章

      网友评论

        本文标题:【C++ 设计模式】4. 建造者模式

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