设计模式----工厂方法模式
工厂方法模式是再简单工厂模式的方法下进行的改进,简单工厂模式有一个大的缺陷就是当要增加新的产品类时,就必须在核心工厂类的判断分支中增加对于新类的判断,即修改工厂类,这样违背了设计模式中的 开放,封闭原则。工厂方法对每一个产品类都建立一个工厂类,这样在增加产品时,只需要增加对应的工厂子类即可,而不必修改工厂父类。工厂方法的结构图如下所示:
// ConsoleApplication49.cpp : 定义控制台应用程序的入口点。
//工厂方法模式
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
class AbstractProduct{
public:
virtual void operation() = 0;
AbstractProduct(){};
virtual ~AbstractProduct(){};
};
class productA :public AbstractProduct{
public:
void operation(){
cout <<"productA::op" << endl;
}
productA(){
cout <<"productA()" << endl;
};
~productA(){
cout <<"~productA " << endl;
}
};
class productB :public AbstractProduct{
public:
void operation(){
cout << "productB::op" << endl;
}
productB(){
cout << "productB()" << endl;
};
~productB(){
cout << "~productB " << endl;
}
};
class AbstractFactory{
public:
virtual AbstractProduct* createProduct() = 0;
AbstractFactory(){};
virtual ~AbstractFactory(){};
};
class FactoryA: public AbstractFactory{
public:
AbstractProduct* createProduct(){
AbstractProduct *temp = new productA;
return temp;
};
FactoryA(){
cout <<"FactoryA " << endl;
};
~FactoryA(){
cout << "~FactoryA " << endl;
};
};
class FactoryB : public AbstractFactory{
public:
AbstractProduct* createProduct(){
AbstractProduct *temp = new productB;
return temp;
};
FactoryB(){
cout << "FactoryB " << endl;
};
~FactoryB(){
cout << "~FactoryB " << endl;
};
};
int _tmain(int argc, _TCHAR* argv[])
{
AbstractFactory* factory = new FactoryA();
AbstractProduct* product = factory->createProduct();
product->operation();
delete product;
product = NULL;
delete factory;
factory = NULL;
factory = new FactoryB();
product = factory->createProduct();
product->operation();
delete product;
product = NULL;
delete factory;
factory = NULL;
system("pause");
return 0;
}
适用场景
工厂方法模式的意义是定义创建产品类的工厂接口,而将将实际的创建工作留给工厂子类。核心工厂类不再负责产品的创建,这样核心工厂类就成为抽象工厂角色,只定义具体工厂子类需要实现的接口。
1 在设计初期就考虑到产品在后期会进行扩展,可以使用工厂模式。
2 产品结构比较复杂的情况下,可以使用工厂模式。