设计模式探秘-5-工厂方法模式

工厂方法模式

工厂方法模式的定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

工厂方法优点

  1. 良好的封装性,代码结构清晰,一个对象创建是有约束的,只要知道对象类的名称(或约束字符串)就可以了,不需要知道创建对象的过程,降低模块间耦合。
  2. 工厂方法模式的扩展性非常优秀。
  3. 屏蔽产品类,调用者不用关心产品类的实现,只需要关系产品的接口。
  4. 工厂模式是典型的解耦框架。高层模块只需要知道产品的抽象类,其它的实现类则不用关系,符合迪米特法则,不需要就不要去交流,符合依赖倒置原则,只依赖产品的抽象类,也符合里氏替换原则,使用产品子类替换父类。

使用场景

  1. 工厂方法模式是new一个对象的替代品,在需要生成对象的地方都可以使用,但需要慎重考虑。因为会增加代码的复杂度。
  2. 需要灵活、可扩展的框架时,可以考虑工厂方法模式。
  3. 工厂模式可以用在异构项目中。
  4. 可以使用在测试驱动开发的框架下。

工厂方法模式的扩展

  1. 缩小为简单工厂模式(静态工厂模式),其缺点是工厂类的扩展比较困难,不符合开闭原则,但仍然是非常使用的设计模式。
  2. 升级为多个工厂类
  3. 替代单例模式,工厂每次都返回唯一的那个对象即可
  4. 延迟初始化,对象使用完,不销毁,下次申请的时候从缓存取一个,初始化后返回

工厂模式实现

常见工厂模式类图

简单工厂模式

多个工厂类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>

using namespace std;

//工厂模式
class Product
{
public:
virtual ~Product(){};
protected:
Product(){};
};

class ConcreteProduct:public Product
{
public:
ConcreteProduct()
{
cout<<__FUNCTION__<<endl;
}
~ConcreteProduct()
{
};
};

class Factory
{
public:
virtual ~Factory(){};
virtual void* CreateProduct() = 0;
protected:
Factory(){};
};

class ConcreteFactory:public Factory
{
public:
ConcreteFactory()
{
cout<<__FUNCTION__<<endl;
}
~ConcreteFactory()
{
}
Product* CreateProduct()
{
return new ConcreteProduct();
}
};

int main()
{
Factory *fac = new ConcreteFactory();
Product *p = (Product*)fac->CreateProduct();
return 0;
}

参考资料

  1. 设计模式之禅
  2. GoF+23种设计模式解析