您的位置:首页 > 其它

创建型模式之FactoryMethod

2015-02-11 21:03 127 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: