1、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类。
2、适用性
(1)当一个类不知道它所必须创建的对象的类的时候
(2)当一个类希望由它的子类来指定它所创建的对象的时候。
(3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3、结构
UML类图表示为
4、参与者
Product:定义工厂方法所创建的对象的接口
ConcreteProduct:实现 Product接口
Creator:声明工厂,该方法返回一个Product类型的对象;可以调用工厂方法创建一个Product对象
ConcreteCreator:重定义工厂方法返回一个Concrete实例对象。
5、协作
Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
其序列图表示为
6、效果
工厂方法不再将与特定应用有关的类绑定到你的代码中,仅处理Product接口。
缺点是仅仅为了创建一个特定的ConcreteProduct对象,就要创建ConcreteCreator子类。
c++样例代码
#include <iostream>
#include <string>
#include <memory>
using namespace std;
enum class ProductType
{
PRODUCT1,
PRODUCT2
};
class Product
{
public:
virtual void method() = 0;
};
class Product1 : public Product
{
public:
void method() {cout << "Product1:method()" << endl;}
};
class Product2 : public Product
{
public:
void method() {cout << "Product2:method()" << endl;}
};
class Creator
{
protected:
virtual unique_ptr<Product> factoryMethod(ProductType type) = 0;
public:
void opration()
{
ProductType productType[] = {ProductType::PRODUCT1, ProductType::PRODUCT2};
for (auto x : productType) {
unique_ptr<Product> product = factoryMethod(x);
product->method();
}
}
};
class ConcreteCreator : public Creator
{
public:
unique_ptr<Product> factoryMethod(ProductType type)
{
unique_ptr<Product> ret(nullptr);
switch (type) {
case ProductType::PRODUCT1:
ret.reset(new Product1);
break;
case ProductType::PRODUCT2:
ret.reset(new Product2);
break;
default:
break;
}
return ret;
}
};
int main()
{
ConcreteCreator cr;
cr.opration();
return 0;
}