C++创建模式

常用的创建设计模式包括如下4种:

1 生成器模式

2 工厂模式

3 原型模式

4 单例模式

在软件工程中,创建模式是用来处理目标创建的机制,尝试以合适的方式创建对象的解决方法。对象创建的的基本形式可能会导致设计问题或者增加设计的复杂性。创建模式通过对象的创建解决这个问题。

生成器模式:

生成器模式从复杂对象的表现形式中分离出它的构造函数,可以实现相同的构造函数创建出不通的对象。

问题:

我们想构建复杂的对象,但是我们不想又复杂的构造函数或者需要很多参数的构造函数

解决方案:

定义一个中间对象,其成员函数在对象可用于客户端之前逐个定义所需对象,生成器模式可以让我们保护构造函数,直到所有的参数都被指定为止。

C++创建模式_第1张图片

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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 "<();
    };

    virtual void buildDough() = 0;
    virtual void buildSauce() = 0;
    virtual void buildTopping() = 0;
protected:
    shared_ptr 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



你可能感兴趣的:(C++)