模式说明(总结这个模式是什么)
factory method 模式是一种用于创建对象的接口技术。再具体的说就是给一个类写一个创建某个类的成员函数,这个类是‘工厂’,这个函数就是‘工厂方法’。不过这个类一般是抽象类。一般被创建的类(product)也是抽象的,会有多个版本的子类。工厂方法具体要创建那个product,需要也需要在子类中实现。
结构
和abstract factory 的区别
可能也很多小伙伴在看完说明后一脸懵逼。这听起来怎么像是abstract factory中的描述啊。没错,其实,这两个模式是说的一个问题,只是侧重点不同。
- abstract factory 说的是抽线工厂技术,重点是这种‘工厂’技术!
他的目的是通过抽象类,为客户提供创建类 统一的抽象接口
!- factory method 说的是创建类的接口技术。重点在这种类方法。
abstract factory 只是说明了怎么来提供接口,接口的实现则需要使用factory method 模式。总之,前者说明了怎么创建接口,后者说明了怎么实现接口
可以实现的效果
- 为子类提供挂钩
贴一个简单的栗子就懂啦
#include <iostream>
using namespace std;
class A
{
public:
A(){};
~A(){};
int dis()
{
cout << "你是谁?\n" << endl;
factory_method();
return 0;
}
virtual int factory_method()
{
cout << "我是A" << endl;
return 0;
}
private:
};
class B :public A
{
public:
B(){};
~B(){};
int factory_method()
{
cout << "我是B" << endl;
return 0;
}
private:
};
int main()
{
B b;
b.dis();
getchar();
return 0;
}
给之类提供一个挂钩以供对线的扩展版本。
- 连接平行的类层次
这种比较好理解,用的也比较多。
提醒:比如类A的一些工作需要委托给类B ,那么类A就可以提供创建类B的工厂方法。这样就可以形成一种平行关系。而且对于客户来讲不需要知道类B是什么,直接通过类A可以创建
实现
- Creator 类可以是抽象类,也可以是具体类。具体类可以为工厂方法提供一个缺省的实现。
参数化工厂方法
这个很好理解,通过给方法传递标识符来区别创建哪一个产品。
B::methond(flag_id) { if(flag_id==1) return new product1; if(flag_id==2) return new product2; return A::methond(flag_id); //调用父类的方法 子类只是扩展了父类的方法 }
使用模板来避免创建子类
之前说了辣么多,可能发现一个问题,如果要创建一个新的产品,就得写一个新的工厂子类。分析问题的关键是没法确定到底创建那个产品,所以就不停的创建子类来重新实现方法。这个问题更加抽线的讲 就是没法确定 参数类型!很容易就想到了模板。
template<calss products> Product * ConcreteCreate<products>:: createProduct() { return new products; }
通过模板参数来控制创建那个产品
我的个人网站 http://www.breeziness.cn/
我的优快云 http://blog.youkuaiyun.com/qq_33775402
转载请注明出处 小风code www.breeziness.cn