动机
- 在软件系统中,经常面临着创建对象的工作,由于需求的变化,需要创建的对象的具体类型经常变化。
- 如何应对这种变化?如何绕开常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类(目的:解耦,手段:虚函数)未使用该设计模式
```cpp class ISplitter { public: virtual void Split() = 0; virtual ~ISplitter() {} }; class BinarySplitter : public ISplitter { };
class txtSplitter : public ISplitter {
};
class PictureSplitter : public ISplitter {
};
class VideoSplitter : public ISplitter {
};
class MainForm { public: void Button1_Click() { //new BinarySplitter是依赖具体类,违背了依赖倒置原则 ISplitter* splitter = new BinarySplitter(filePath, number);
splitter.split();}
};
<a name="lFuk7"></a>### 实现1```cppclass SplitterFactory{public:virtual ISplitter* CreateSplitter() = 0;virtual ~SplitterFactory() {}};class ISplitter{public:virtual void Split() = 0;virtual ~ISplitter() {}};class BinarySplitter : public ISplitter{};class BinarySplitterFactory : public SplitterFactory{public:ISplitter* CreateSplitter() {return new BinarySplitter();}};class txtSplitter : public ISplitter{};class txtSplitterFactory : public SplitterFactory{public:ISplitter* CreateSplitter() {return new txtSplitter();}};class PictureSplitter : public ISplitter{};class PictureSplitterFactory : public SplitterFactory{public:ISplitter* CreateSplitter() {return new PictureSplitter();}};class VideoSplitter : public ISplitter{};class VideoSplitterFactory : public SplitterFactory{public:ISplitter* CreateSplitter() {return new VideoSplitter();}};class MainForm{SplitterFactory* factory;public:MainForm(SplitterFactory* factory) { //根据传入的参数创建不同的工厂this->factory = factory;}void Button1_Click() {ISplitter* splitter = factory->CreateSplitter(); //多态newsplitter.split();}};
面向对象的松耦合设计不是将依赖具体的类给消灭掉,而是实际上将变换赶到某个局部。
