C++实现:
#include
<iostream>
using namespace std;
//Pizza
抽象类 稳定部分
class
Pizza
{
public:
virtual void Bake() const =0;
virtual void Cut () const =0;
virtual ~Pizza()
{
}
};
//PizzaStore Pizza
店的抽象象,相当于一个工厂,
//
你需要Macdonaldizza或者是KFCPizza中需向这个工厂请求 稳定部分
class
PizzaStore
{
public:
virtual Pizza* CreatePizza() =0;
virtual ~PizzaStore()
{
}
};
//
具体的Pizza实现 不稳定部分
class McdonaldPizza : public Pizza
{
public:
McdonaldPizza()
{
cout<<"Create McdonaldPizza"<<endl;
Bake();
Cut();
}
void Bake() const
{
cout<<"Bake McdonaldPizza for 25 minutes!"<<endl;
}
void Cut () const
{
cout<<"Cutting McdonaldPizza into square slices!"<<endl;
}
};
class KFCPizza : public Pizza
{
public:
KFCPizza()
{
cout<<"Create KFCPizza"<<endl;
Bake();
Cut();
}
void Bake() const
{
cout<<"Bake KFCPizza for 30 minutes!"<<endl;
}
void Cut () const
{
cout<<"Cutting KFCPizza into diagonal slices!"<<endl;
}
};
//PizzaStore
的具体实现 不稳定部分
class McdonaldPizzaStore :public PizzaStore
{
public:
Pizza* CreatePizza()
{
return new McdonaldPizza();
}
};
class KFCPizzaStore :public PizzaStore
{
public:
Pizza* CreatePizza()
{
return new KFCPizza();
}
};
//
客户程序
int
main(void)
{
//
需要麦当劳的Pizza,只需要向McdonaldPizzaStore工厂请求
PizzaStore *pMcdonaldPizzaStore =new McdonaldPizzaStore();
Pizza *pMcdonaldPizza =pMcdonaldPizzaStore->CreatePizza();
cout<<"+++++++++++++++++++++++++++++"<<endl;
//
需要KFC的Pizza,只需要向KFCPizzaStore工厂请求
PizzaStore *pKFCPizzaStore =new KFCPizzaStore();
Pizza *pKFCPizza =pKFCPizzaStore->CreatePizza();
system("Pause");
return 0;
}
|
Factory模式也带来至少以下两个问题:
1)如果为每一个具体的CreatePizza类的实例化提供一个函数体,那么我们可能不得不在系统中添加了一个方法来处理这个新建的CreatePizza,这样PizzaStore的接口永远就不肯能封闭(Close)。当然我们可以通过创建一个PizzaStore的子类来通过多态实现这一点,但是这也是以新建一个类作为代价的。
2)在实现中我们可以通过参数化工厂方法,即给CreatePizza()传递一个参数用以决定是创建具体哪一个具体的Pizza。
上面Pizza 的例子是通过创建一个PizzaStore的子类来通过多态实现这一点。但是造成了新增一个类为代价。如果我们还要通过这个工厂创建Milk,在PIzza中加入Milk,那个需要创建一系列相互关联的对象,那么就需要Abstract Factory。这也正是Factory Method 与Abstract Factory的根本区别所在。