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



猜你喜欢

转载自blog.csdn.net/Docterzzz/article/details/80209232
今日推荐