C++ 简单工厂模式

假设有如下的场景: 

 卖pizza的, 可以有很多种pizza(CheesePizza, GreekPizza, PepperoniPizza),我们该如何处理它呢,当然我们可以声明一个类,类中创建每一个种类的pizza。但是这样有什么问题吗?我们没有把需要改变的部分剥离出来。

软件设计的一个原则就是“是易于扩充而不是修改”,另一个是“对接口编程而不是对实现编程”。 这里就轮到工厂模式出手了。 

工厂模式有三种:

简单工厂

抽象工厂

工厂方法

下面是简单工厂模式


#include <iostream>
#include <windows.h>
#include <memory>

using namespace std;

class Pizza
{
public:
	Pizza(){};
	virtual ~Pizza(){};

	virtual void MakePizza()=0;
};

class CheesePizza:public Pizza
{
public:
	CheesePizza(){};
	~CheesePizza(){};

	void MakePizza()
	{
		cout<<"Make Cheese Pizza"<<endl;
	}
};

class GreekPizza:public Pizza
{
public:
	GreekPizza(){};
	~GreekPizza(){};

	void MakePizza()
	{
		cout<<"Make Greek Pizza"<<endl;
	}
};

class	PepperoniPizza:public Pizza
{
public:
	PepperoniPizza(){};
	~PepperoniPizza(){};

	void MakePizza()
	{
		cout<<"Make Pepperoni Pizza"<<endl;
	}
};

enum PIZZA_TYPE
{
	PIZZA_TYPE_CHEESE=0,
	PIZZA_TYPE_GREEK,
	PIZZA_TYPE_PEPPERONI
};

class PizzaFactory
{
public:
	PizzaFactory(){};
	~PizzaFactory(){};

	static shared_ptr<Pizza> createPizza(PIZZA_TYPE pizzaType)
	{
		switch (pizzaType)
		{
		case PIZZA_TYPE_CHEESE:
			return shared_ptr<Pizza> (new CheesePizza());
		case PIZZA_TYPE_GREEK:
			return shared_ptr<Pizza>(new GreekPizza());
		case PIZZA_TYPE_PEPPERONI:
			return shared_ptr<Pizza>(new PepperoniPizza());
		default:
			return shared_ptr<Pizza>(new PepperoniPizza());
		}
	}
};

int main(int argc,char* argv[])
{
	shared_ptr<Pizza> cheesePizza=PizzaFactory::createPizza(PIZZA_TYPE_CHEESE);
	shared_ptr<Pizza> greekPizza=PizzaFactory::createPizza(PIZZA_TYPE_GREEK);
	shared_ptr<Pizza> pepperoniPizza=PizzaFactory::createPizza(PIZZA_TYPE_PEPPERONI);

	cheesePizza->MakePizza();
	greekPizza->MakePizza();
	pepperoniPizza->MakePizza();

	system("pause");
	return 0;

}


C++ 简单工厂模式_第1张图片

你可能感兴趣的:(工厂模式)