1 工厂模式
- 父类决定实例的生成方式,但并不决定所要生成具体的类,具体处理全部交给子类处理。 将生成实例的框架与具体的实例类解耦。
- 在软件系统中,经常面临创建对象的工作,由于需求的变化,需要创建的对象的具体类型经常变化
- 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
2 问题
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
| class ISplitter{ public: virtual void split()=0; virtual ~ISplitter(){} };
class BinarySplitter : public ISplitter{ virtual void split(){ } };
class TxtSplitter: public ISplitter{ virtual void split(){ } };
class PictureSplitter: public ISplitter{ virtual void split(){ } };
class VideoSplitter: public ISplitter{ virtual void split(){ } };
|
1 2 3 4 5 6 7 8 9
| class MainForm : public Form{ public: void Button1_Click(){ ISplitter * splitter = new BinarySplitter(); splitter->split(); } };
|
3 工厂模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类
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 57 58 59 60 61 62 63 64 65 66 67
| class ISplitter{ public: virtual void split()=0; virtual ~ISplitter(){} };
class SplitterFactory{ public: virtual ISplitter* CreateSplitter()=0; virtual ~SplitterFactory(){} };
class BinarySplitter : public ISplitter{ virtual void split(){ } };
class TxtSplitter: public ISplitter{ virtual void split(){ } };
class PictureSplitter: public ISplitter{ virtual void split(){ } };
class VideoSplitter: public ISplitter{ virtual void split(){ } };
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(); } };
|
1 2 3 4 5 6 7 8 9 10 11 12
| class MainForm : public Form{ SplitterFactory* factory; public: MainForm(SplitterFactory* factory){ this->factory=factory; } void Button1_Click(){ ISplitter * splitter = factory->CreateSplitter(); splitter->split(); } };
|
4 总结
- Factory Method模式用于隔离类对象的使用者和具体类型之间的 耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导 致软件的脆弱。
- Factory Method模式通过面向对象的手法,将所要创建的具体对 象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
- Factory Method模式解决“单个对象”的需求变化。缺点在于要 求创建方法/参数相同。
5 参考