工厂方法模式定义了一个创建对象的接口,但由子类决定具体要实例化的类是哪一个;工厂方法让类把实例化推迟到子类。工厂方法的类图如下:
在工厂方法模式中Creator提供了一个抽象的创建对象的方法facotryMethod,然后Creator中实现的所有操作都可以调用这个factoryMethod产生的对象,但是factoryMethod是由子类实现的,这样就达到了封装对象创建的目的。
下面是一个具体应用工厂方法的实例:
下面是这个实例的程序,为了做到精简:程序中只写了一个创建者类PizzaStore的子类,产品类的Pizza的子类只写了两个。
#include "stdafx.h"
#include <iostream>
#include <string>
#include <memory>
using namespace std;
//抽象产品类
class Pizza
{
public:
string name;
string dough;
string sauce;
void prepare()
{
cout<<"Preparing "<<name<<endl;
cout<<"Tossing dough..."<<endl;
cout<<"Adding sauce..."<<endl;
}
void bake()
{
cout<<"Bake for 25 minutes at 350"<<endl;
}
void cut()
{
cout<<"Cutting the pizza into diagonal slices"<<endl;
}
void box()
{
cout<<"Place pizza in official PizzaStore box"<<endl;
}
string getName()
{
return name;
}
};
//具体的产品
class ChicagoStyleCheesePizza:public Pizza
{
public:
ChicagoStyleCheesePizza()
{
name="Chicago Style Deep Dish Cheese Pizza";
dough="Extra Thick Crust Dough ";
sauce = "Plum Tomato Sauce";
}
void cut()
{
cout<<"Cutting the pizza into square slices"<<endl;
}
};
class ChicagoStyleClamPizza:public Pizza
{
public:
ChicagoStyleClamPizza()
{
name = "Chicago Style Clam Pizza";
dough = "Extra Thick Crust Dough";
sauce = "Plum Tomato Sauce";
}
void cut()
{
cout<<"Cutting the pizza into square slices"<<endl;
}
};
//创建者类
class PizzaStore
{
public:
shared_ptr<Pizza> orderPizza(string type)
{
shared_ptr<Pizza> pizza;
pizza=createPizza(type); //使用工厂方法生成的产品,并不在乎具体产品是什么
pizza->prepare();
pizza->bake();
pizza->cut();
pizza->box();
return pizza;
}
protected:
virtual shared_ptr<Pizza> createPizza(string type)=0; //生成产品的方法(即工厂方法)
};
//创建者类的子类(具体产品的创建者)
class ChicagoPizzaStore:public PizzaStore {
public:
shared_ptr<Pizza> createPizza(string item)
{
if (item.compare("cheese")==0)
{
return shared_ptr<Pizza>(new ChicagoStyleCheesePizza);
}
else if (item.compare("clam")==0)
{
return shared_ptr<Pizza>(new ChicagoStyleClamPizza);
}
else return nullptr;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<PizzaStore> chicagoStore=shared_ptr<PizzaStore>(new ChicagoPizzaStore);
shared_ptr<Pizza> pizza=chicagoStore->orderPizza("cheese");
cout<<"I order a "<<pizza->getName()<<endl;
shared_ptr<Pizza> pizza1=chicagoStore->orderPizza("clam");
cout<<"Xiaoming order a "<<pizza1->getName()<<endl;
return 0;
}
程序结果如下: