建造者模式(C++)

前言

  建造者模式从实现上和简单工厂有些类似,不同的地方主要体现在工厂模式解决的问题是“生产”(不管是简单工厂下的具体化产品还是抽象工厂下的一类产品),也就是如何通过分支(或者反射)去生产出“产品”;而建造者模式解决的问题是“组合”,也就是如何将不同的原材料通过某一种组合算法去创建一个产品。

建造者模式

1. 概要

建造者模式概要

2. 实现方法

/********* 建造者模式 **********/
#ifndef BUILDER_H
#define BUILDER_H

#include <iostream>
#include <string>

using namespace std;

//具体的产品类(包括食物和饮料)
class Order
{
public:
    Order() {}
    void setFood(const string &food){ this->m_strFood = food; }
    void setDrink(const string &drink) { this->m_strDrink = drink; }
    const string &getFood(){
        cout << this->m_strFood.data() << endl;
        return this->m_strFood;
    }
    const string &getDrink(){
        cout << this->m_strDrink.data() << endl;
        return this->m_strDrink;
    }
private:
    string m_strFood;
    string m_strDrink;
};

//抽象建造类(基类,提供接口)
class OrderBuilder
{
public:
    OrderBuilder() {}
    virtual ~OrderBuilder(){}
    virtual void setOrderFood() = 0; //获取食物
    virtual void setOrderDrink() = 0; //获取饮料
    virtual Order* getOrder() = 0; //获取总的菜单
};

//具体的建造类(中餐菜单)
class OrderBuilder_Chinese : public OrderBuilder
{
public:
    OrderBuilder_Chinese() {
       this->m_pOrder = new Order();
    }
    ~OrderBuilder_Chinese(){
        delete this->m_pOrder;
        this->m_pOrder = nullptr;
    }

    virtual void setOrderFood() override { //获取食物
        this->m_pOrder->setFood("Chinese Food");
    }
    virtual void setOrderDrink() override{ //获取饮料
        this->m_pOrder->setDrink("Chinese Drink");
    }
    virtual Order* getOrder() override{//获取菜单
         return this->m_pOrder;
    }

private:
    Order* m_pOrder;

};

//具体的建造类(西餐菜单)
class OrderBuilder_West : public OrderBuilder
{
public:
    OrderBuilder_West() {
       this->m_pOrder = new Order();
    }
    ~OrderBuilder_West(){
        delete this->m_pOrder;
        this->m_pOrder = nullptr;
    }

    virtual void setOrderFood() override { //获取食物
        this->m_pOrder->setFood("British Food");
    }
    virtual void setOrderDrink() override{ //获取饮料
        this->m_pOrder->setDrink("British Drink");
    }
    virtual Order* getOrder() override{//获取菜单
         return this->m_pOrder;
    }

private:
    Order* m_pOrder;

};

//建造者模式还要有一个负责管理实例关系的类(如何组合)
class Director
{
public:
    Director(OrderBuilder* builder):m_pOrderBuilder(builder){}
    void construct(){//建造的逻辑
        this->m_pOrderBuilder->setOrderFood();
        this->m_pOrderBuilder->setOrderDrink();
    }
private:
    OrderBuilder *m_pOrderBuilder;
};

//建造者模式的应用实例
class Builder
{
public:
    Builder();
    void run_example(){
       cout << "***** Builder *****" << endl;

       //自行选择是哪个菜单(比如中餐,如果切换到西餐,只需要改动一行即可)
       OrderBuilder *builder = new OrderBuilder_Chinese;
//       OrderBuilder *builder = new OrderBuilder_West;
       Director *director = new Director(builder);

       director->construct();//开始构建(初始化是在构建类中完成)
       builder->getOrder()->getFood();//构建完成后,便可以获取数据了
       builder->getOrder()->getDrink();//构建完成后,便可以获取数据了

       delete director;
       director = nullptr;
       delete builder;
       builder = nullptr;
    }
};

#endif // BUILDER_H

3. 设计模式总结

  总之,建造者模式主要是应用在“创建过程复杂,但是组合的算法是大同小异”的场景下,需要注意的是,建造者模式要求产品本身是由多个子对象组合而成的,否则,建议用用其他的设计模式创建对象。

  另外,C++中的一些设计模式的总结导航,可以参考这里(设计模式总结)。

参考资料

[1] https://www.runoob.com/design-pattern/builder-pattern.html
[2] https://www.cnblogs.com/chengjundu/p/8473564.html

原文链接: https://www.cnblogs.com/treature/p/13198793.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    建造者模式(C++)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/359516

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午12:47
下一篇 2023年3月2日 下午12:48

相关推荐