常用的創建設計模式包括如下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