工厂方法模式
先看一下最原始的程序伪代码:
MainForm1.cpp:
class MainForm :public Form{ TextBox* txtFilePath; TextBox* txtFileNumber; ProgressBar* progressBar; public: void Button1_Click() { string filePath = txtFilePath->getText(); int number = atoi(txtFileNumber->getText().c_str()); FileSplitter* splitter = new FileSplitter(filePath,number); splitter->split(); } };
Splitter1.cpp:
class FileSplitter { public: void split() { //..... } };
当有需求了:
MainForm2.cpp:
class MainForm :public Form{ SplitterFactory* factory; public: MainForm(SplitterFactory* factory){ this->factory = factory; } void Button1_Click() { ISplitter* splitter = factoryy.CreateSplitter;//依赖具体类 splitter->split(); } };
Splitter2.cpp:
//具体类 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(); } };
SplitterFactory.cpp:
//工厂基类 class SplitterFactory{ public: virtual ISplitter* CreateSplitter() = 0; virtual ~SplitterFactory(); }; //抽象基类 class ISplitter{ public: virtual void split() = 0; virtual ~ISplitter(); };
工厂模式的应用前景:
1.工厂模式的目的是为了实现解耦,将对象的创建和使用分开,即应用程序将对象的创建和初始化职责交给工厂对象。若一个对象A想要调用对象B时,如果直接通过new关键字来创建一个B实例,然后调用B实例,这样做的不好处是,当需求变更,要将B实例换成C实例时,则需要修改所有new了该实例的方法。
2.降低代码重复。如果对象B的创建过程比较复杂,并且很多地方都用到了,那么很可能出现很多重复的代码,通过统一将创建对象B的代码放到工厂里面统一管理,可以减少代码的重复率,同时也方便维护。相比于构造函数来说,复杂的初始化,会使得构造函数非常的复杂。
由于创建过程都由工厂统一的管理,有利于当业务发生变化之后的修改
3.工厂模式将创建和使用分离,使用者不需要知道具体的创建过程,只需要使用即可。
4.类本身有很多子类,并且经常性发生变化。
总体概括:
创建对象需要大量重复的代码。
创建对象需要访问某些信息,而这些信息不应该包含在复合类中。
创建对象的生命周期必须集中管理,以保证在整个程序中具有一致的行为。