工厂方法模式

说到工厂方法模式,我们先与简单工厂模式进行一个简单的对比,简单工厂模式主要解决了对于同一个分类的对象的创建问题,而工厂方法模式则解决了多个不同分类对象的创建问题,它们运用的环境是不一样的。举一个例子,假设我们仅仅只有一个Pizza店,那么我们仅仅只需要创建这个店里面不同的Pizza对象,那么采用简单工厂模式即可,如果我们的Pizza店遍布各地,因为每个地方都要根据当地的特色制作不同风格的Pizza,那么我们就需要根据不同Pizza店,来创建属于这个Pizza店的一类Pizza对象了。

接下来看看工厂方法模式的类图:


这个类图够简单吧,但是其创建实例对象的思想还是值得称赞一番的。其实工厂方法模式的主要思想,就是将创建实例Pizza对象的代码放到派生类中,也就是说,由具体的Pizza店来决定怎么创建Pizza,为什么要这么多呢,如果我们在基类中实现所有创建Pizza对象的代码,那么一旦要修改、增加、删除Pizza就不得不去修改以前的代码,违背了“对扩展开放,对修改关闭”的原则。而我们再联想一下具体的实际情况,如果我们要增加一个Pizza店,那么完全不用去理会以前的代码,如果我们要修改某个Pizza店的Pizza创建方式,影响面也会小很多,其实仔细想来,如果我们真的实实在在的在经营这样一家企业,实际的运作情况也应该是这样的,这样的处理方式才是最自然的。

不废话了,贴源码:

#include <iostream>
#include <string>

using namespace std;

class Pizza
{
public:
	Pizza() : name("Pizza"){};

	void prepare()
	{
		cout << "准备Pizza" << endl;
	}

	void bake()
	{
		cout << "烘烤Pizza" << endl;
	}

	void cut()
	{
		cout << "切Pizza" << endl;
	}

	void box()
	{
		cout << "装Pizza" << endl;
	}

	string name;
};

class NYCheesePizza : public Pizza
{
public:
	NYCheesePizza()
	{
		name = "NYCheesePizza";
	}
};

class NYClamPizza : public Pizza
{
public:
	NYClamPizza()
	{
		name = "NYClamPizza";
	}
};

class ChicagoCheesePizza : public Pizza
{
public:
	ChicagoCheesePizza()
	{
		name = "ChicagoCheesePizza";
	}
};

class ChicagoClamPizza : public Pizza
{
public:
	ChicagoClamPizza()
	{
		name = "ChicagoClamPizza";
	}
};

class PizzaStore
{
public:
	virtual Pizza* createPizza(string pizzaType) = 0;
	Pizza* orderPizza(string pizzaType)
	{
		Pizza *pizza = createPizza(pizzaType);

		pizza->prepare();
		pizza->bake();
		pizza->cut();
		pizza->box();

		return pizza;
	}
};

class NYPizzaStore : public PizzaStore
{
public:
	Pizza* createPizza(string pizzaType)
	{
		Pizza *pizza = NULL;

		if (pizzaType == "cheese")
		{
			pizza = new NYCheesePizza;
		}
		else if (pizzaType == "clam")
		{
			pizza = new NYClamPizza;
		}

		return pizza;
	}
};

class ChicagoPizzaStore : public PizzaStore
{
public:
	Pizza* createPizza(string pizzaType)
	{
		Pizza *pizza = NULL;

		if (pizzaType == "cheese")
		{
			pizza = new ChicagoCheesePizza;
		}
		else if (pizzaType == "clam")
		{
			pizza = new ChicagoClamPizza;
		}

		return pizza;
	}
};

void main()
{
	int i = 0;
	PizzaStore *nyPizzaStore = new NYPizzaStore;
	PizzaStore *chicagoPizzaStore = new ChicagoPizzaStore;

	Pizza *nyPizza = nyPizzaStore->orderPizza("cheese");
	Pizza *chicagoPizza = chicagoPizzaStore->orderPizza("cheese");

	cout << "订购成功:" + nyPizza->name << endl;
	cout << "订购成功:" + chicagoPizza->name << endl;

	cin >> i;
}

总结一下:

看源码我们可以知道,工厂方法模式的核心就是,基类抽象了创建对象的方法,具体的方法实现延后到派生类实现。从而解决了多个不同分类对象的创建问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值