0.参考资料
…
1.概述
- 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数—即多态)到子类。 ——《设计模式》GoF
- 核心: 依赖倒置原则 + 迪米特法则(最少知道原则)
其本质可是抽象工厂模式的特例: 相关/相互依赖的对象只有一个
1.1动机
- 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。- 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合? 即: 不依赖具体实现, 而依赖抽象.
1.2结构
- 
2.要点总结
方案
类图
代码
- 调用端/客户端:
class MainForm : public Form{SplitterFactory* factory;//工厂public:MainForm(SplitterFactory* factory){this->factory=factory;}void Button1_Click(){ISplitter * splitter=factory->CreateSplitter(); //多态newsplitter->split();}};
- 引用的抽象
//抽象类class ISplitter{public:virtual void split()=0;virtual ~ISplitter(){}};//工厂基类class SplitterFactory{public:virtual ISplitter* CreateSplitter()=0;virtual ~SplitterFactory(){}};
- 具体的实现(具体类及其对应的具体工厂)
//具体类class BinarySplitter : public ISplitter{};class TxtSplitter: public ISplitter{};class PictureSplitter: public ISplitter{};class VideoSplitter: public ISplitter{};//具体工厂class BinarySplitterFactory: public SplitterFactory{public:virtual ISplitter* CreateSplitter(){return new BinarySplitter();}};class TxtSplitterFactory: public SplitterFactory{public:virtual ISplitter* CreateSplitter(){return new TxtSplitter();}};class PictureSplitterFactory: public SplitterFactory{public:virtual ISplitter* CreateSplitter(){return new PictureSplitter();}};class VideoSplitterFactory: public SplitterFactory{public:virtual ISplitter* CreateSplitter(){return new VideoSplitter();}};
5.经典使用
5.1 JDK中 Collection.iterator()方法
- Collection: 工厂类- Collection.iterator(): 工厂方法- ArrayList: 实现了具体工厂方法- ArrayList.iterator(): Iterator- Iterator: 抽象产品- Itr: 具体产品
