常用的创建设计模式包括如下4种:
1 生成器模式
2 工厂模式
3 原型模式
4 单例模式
在软件工程中,创建模式是用来处理目标创建的机制,尝试以合适的方式创建对象的解决方法。对象创建的的基本形式可能会导致设计问题或者增加设计的复杂性。创建模式通过对象的创建解决这个问题。
生成器模式:
生成器模式从复杂对象的表现形式中分离出它的构造函数,可以实现相同的构造函数创建出不通的对象。
问题:
我们想构建复杂的对象,但是我们不想又复杂的构造函数或者需要很多参数的构造函数
解决方案:
定义一个中间对象,其成员函数在对象可用于客户端之前逐个定义所需对象,生成器模式可以让我们保护构造函数,直到所有的参数都被指定为止。
#include <string>
#include <iostream>
#include <memory>
#include <string>
#include <cstdlib>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;
class Pizza
{
public:
void setDough(const string& dough)
{
m_dough = dough;
}
void setSauce(const string& sauce)
{
m_sauce = sauce;
}
void setTopping(const string& topping)
{
m_topping = topping;
}
void open() const
{
cout<<"Pizza with "<<m_dough<<" dough "<<m_sauce<<" sauce "<<m_topping
<<" topping "<<endl;
}
private:
string m_dough;
string m_sauce;
string m_topping;
};
class PizzaBuilder
{
public:
virtual ~PizzaBuilder(){};
Pizza *getPizza()
{
return m_pizza.get();
};
void createNewPizzaProduct()
{
m_pizza = make_shared<Pizza>();
};
virtual void buildDough() = 0;
virtual void buildSauce() = 0;
virtual void buildTopping() = 0;
protected:
shared_ptr<Pizza> m_pizza;
};
class HawaiianPizzaBuilder:public PizzaBuilder
{
public:
virtual ~HawaiianPizzaBuilder(){};
virtual void buildDough()
{
m_pizza->setDough("cross");
}
virtual void buildSauce()
{
m_pizza->setSauce("mild");
}
virtual void buildTopping()
{
m_pizza->setTopping("ham + pineapple");
}
};
class SpicyPizzaBuilder : public PizzaBuilder
{
public:
virtual ~SpicyPizzaBuilder() {};
virtual void buildDough()
{
m_pizza->setDough("pan baked");
}
virtual void buildSauce()
{
m_pizza->setSauce("hot");
}
virtual void buildTopping()
{
m_pizza->setTopping("pepperoni+salami");
}
};
class Cook
{
public:
void openPizza()
{
m_pizzaBuilder->getPizza()->open();
}
void makePizza(PizzaBuilder* pb)
{
m_pizzaBuilder = pb;
m_pizzaBuilder->createNewPizzaProduct();
m_pizzaBuilder->buildDough();
m_pizzaBuilder->buildSauce();
m_pizzaBuilder->buildTopping();
}
private:
PizzaBuilder *m_pizzaBuilder;
};
int main()
{
Cook cook;
HawaiianPizzaBuilder hawaiianPizzaBuilder;
SpicyPizzaBuilder spicyPizzaBuilder;
cook.makePizza(&hawaiianPizzaBuilder);
cook.openPizza();
cook.makePizza(&spicyPizzaBuilder);
cook.openPizza();
return 0;
}
原始代码调用的是unique_ptr,用codeblock编译中的gcc编译时不能通过,暂时改为shared_ptr。
源代码地址:https://en.wikibooks.org/wiki/C%2B%2B_Programming/Code/Design_Patterns/Creational_Patterns