对象创建模式
通过“对象创建”模式绕开new, 来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。
典型模式
- Factory Method 工厂模式
- Abstract Factory抽象工厂
- Prototype原型
- Builder建造者
这四个模式在演化过程中有细微的不同。
01动机(Motivation)
在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
如何应对这种变化?如何绕过常规的对象创建方法(new)提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
一定要抽丝剥茧去还原它最初的设计场景去理解---》使用一种方法返回一个对象
设计模式一定要在对比中才有收获
02模式定义
定义一个用创建对象的接口,让子类决定实例化哪一个类。Factory Method 类使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。
----《设计模式》GoF
//MainForm2.cpp
class MainForm :public Form
{
SplitterFactory* factory;
public:
//变化被赶出去了
MainForm(SplitterFactory* factory)
{
this->factory = factory;//工厂
}
void Button1_Click()
{
//多态new
ISplitter* splitter = factory->CreateSplitter();;//依赖具体类
splitter->aplit();
}
};
//FileSplitter2.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();
}
};
//FileSplitter1.cpp
//说明:本文集是基于在第8课讲工厂模式时使用添加的,不是在讲观察者模式的时候添加的
//1.抽象出基类
class ISplitter
{
public:
ISplitter();
virtual void split() = 0;
virtual ~ISplitter() {}
};
//工厂基类
class SplitterFactory
{
public:
//改成虚函数,就是运行时依赖了
virtual ISplitter* CreateSplitter() = 0;
virtual ~SplitterFactory() {}
};
03代码说明
- 创建对象的接口
//工厂基类
class SplitterFactory
{
public:
//改成虚函数,就是运行时依赖了
virtual ISplitter* CreateSplitter() = 0;//负责创建
virtual ~SplitterFactory() {}
};
- 让子类(BinarySplitterFactory)决定实例化哪个类(BinarySplitter)
子类:txtSplitterFactory 决定实例化TxtSplitter
子类:PictureSplitterFactory决定实例化PictureSplitter
子类:VideoSplitterFactory决定实例化VideoSplitter
延迟而非更改。
04 要点总结