说到工厂方法模式,我们先与简单工厂模式进行一个简单的对比,简单工厂模式主要解决了对于同一个分类的对象的创建问题,而工厂方法模式则解决了多个不同分类对象的创建问题,它们运用的环境是不一样的。举一个例子,假设我们仅仅只有一个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;
}
总结一下:
看源码我们可以知道,工厂方法模式的核心就是,基类抽象了创建对象的方法,具体的方法实现延后到派生类实现。从而解决了多个不同分类对象的创建问题。