前言
建造者模式从实现上和简单工厂有些类似,不同的地方主要体现在工厂模式
解决的问题是“生产”(不管是简单工厂下的具体化产品还是抽象工厂下的一类产品),也就是如何通过分支(或者反射)去生产出“产品”;而建造者模式解决的问题是“组合”,也就是如何将不同的原材料通过某一种组合算法去创建一个产品。
建造者模式
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大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/359516
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!