意图:定义一个创建对象的接口,让子类决定实例化哪个类,使得一个类的实例化延迟到其子类。又叫虚构造器(Virtual Constructor),算是最基本的一个模式
一个应用实例:
#include <iostream>
using namespace std;
class Operation //工厂方法创建的对象(产品)的接口
{
public:
int num1, num2;
virtual int GetResult()
{
return 0;
};
};
class Add:public Operation //一个工厂方法创建的对象(产品)的实现
{
public:
int GetResult()
{
return num1 + num2;
}
};
//可添加更多的实现
class Factory //工厂方法
{
public:
virtual Operation* CreateOperation() = 0;
};
class AddFactory:public Factory //具体的工厂
{
public:
Operation* CreateOperation()
{
return new Add();
}
};
int main()
{
Factory* f = new AddFactory();
Operation* p = f->CreateOperation();
p->num1 = 5;
p->num2 = 5;
cout << p->GetResult();
delete f;
delete p;
}
使用模板避免创建工厂子类的方法:
#include <iostream>
using namespace std;
class Operation //工厂方法创建对象的接口
{
public:
int num1, num2;
virtual int GetResult()
{
return 0;
};
};
class Add:public Operation //一个工厂方法创建的对象的实现
{
public:
int GetResult()
{
return num1 + num2;
}
};
//可以添加更多的实现
class Factory //工厂方法
{
public:
virtual Operation* CreateOperation() = 0;
};
template<class TheProduct>
class StandardFactory:public Factory //具体的工厂
{
public:
Operation* CreateOperation()
{
return new TheProduct();
}
};
int main()
{
StandardFactory<Add>* f = new StandardFactory<Add>();
Operation* p = f->CreateOperation();
p->num1 = 5;
p->num2 = 5;
cout << p->GetResult();
delete f;
delete p;
}
1 使得不再将特定应用的类绑定在代码中,代码只需要处理产品的接口
2 当客户仅仅为了创建一个特定的产品对象时,就不得不创建新的工厂类的子类。使用模板可以避免这个缺点
相关模式:
1 Abstract Factory经常使用工厂方法来实现
2 Template Methods经常调用工厂方法