C++創建模式

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章