C++ 工厂方法设计模式的学习 (Boolan学习笔记第12周)
2017-04-12 14:26
507 查看
这周学习了几种设计模式,发现4种设计模式
Factory Method
Abstract Factory
Protytype
Builder
其实是很相似的。它们都是定义一个用于创建对象的接口,让子类来决定实例化哪一个类,从而使得一个类的实例化延迟,这样,就可以避免new过程中所导致的依赖具体类的紧耦合。
首先来看Factory Method设计模式,GOF里面的原话是:
**Define an interface for creating an object, but let subclasses decide which class to instantiate.
Factory Method lets a class defer instantiation to subclasses.**
翻译成中文就是“定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。”。
结构图如下:
上面的Creator就是抽象工厂, ConcreteCreator就是具体工厂。Product是抽象产品,它定义了工厂方法创建的对象的接口。ConcreteProduct是具体产品,它实现了Product接口。
说简单一点就是:抽象工厂是与客户端的接口,这样客户就不需要知道具体工厂的细节。具体工厂负责生产具体产品,里面就负责具体产品的业务逻辑怎么实现。抽象产品是具体产品的父类或实现的接口。
打个比方:苹果公司是一个抽象工厂,我们必须要制定具体的工厂才能生成具体的产品,象IPhone6, IPhone6S, IPhone7 每一个就是一个具体产品,其对应一个具体工厂。
一个按工厂方法设计模式的文件分割器的伪代码实现如下。它模拟了二进制分割,文本分割,图像分割和视频分割等不同业务的实现。
上面的代码中,每种业务都有一个具体类/具体工厂。在MainFrame中,其具体工厂的参数会引入,这样,当用户点击button时就会生成相应的产品。这样做的好处就是MainFrame里面再也不需要根据具体的产品来调用一堆if…else代码,非常简洁。
Factory Method
Abstract Factory
Protytype
Builder
其实是很相似的。它们都是定义一个用于创建对象的接口,让子类来决定实例化哪一个类,从而使得一个类的实例化延迟,这样,就可以避免new过程中所导致的依赖具体类的紧耦合。
首先来看Factory Method设计模式,GOF里面的原话是:
**Define an interface for creating an object, but let subclasses decide which class to instantiate.
Factory Method lets a class defer instantiation to subclasses.**
翻译成中文就是“定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。”。
结构图如下:
上面的Creator就是抽象工厂, ConcreteCreator就是具体工厂。Product是抽象产品,它定义了工厂方法创建的对象的接口。ConcreteProduct是具体产品,它实现了Product接口。
说简单一点就是:抽象工厂是与客户端的接口,这样客户就不需要知道具体工厂的细节。具体工厂负责生产具体产品,里面就负责具体产品的业务逻辑怎么实现。抽象产品是具体产品的父类或实现的接口。
打个比方:苹果公司是一个抽象工厂,我们必须要制定具体的工厂才能生成具体的产品,象IPhone6, IPhone6S, IPhone7 每一个就是一个具体产品,其对应一个具体工厂。
一个按工厂方法设计模式的文件分割器的伪代码实现如下。它模拟了二进制分割,文本分割,图像分割和视频分割等不同业务的实现。
//抽象类 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* CreateSplit 4000 ter(){ return new VideoSplitter(); } }; { SplitterFactory* factory;//工厂 public: MainForm(SplitterFactory* factory){ this->factory=factory; } void Button1_Click(){ ISplitter * splitter= factory->CreateSplitter(); //多态new splitter->split(); } };
上面的代码中,每种业务都有一个具体类/具体工厂。在MainFrame中,其具体工厂的参数会引入,这样,当用户点击button时就会生成相应的产品。这样做的好处就是MainFrame里面再也不需要根据具体的产品来调用一堆if…else代码,非常简洁。
相关文章推荐
- C++设计模式学习笔记五:工厂方法模式
- 设计模式:抽象工厂模式(C++)【工厂方法升级】
- 设计模式学习笔记(五):工厂方法模式
- 设计模式之工厂模式结合单例模式C++计算器代码DEMO(历史代码,贴出学习)
- C++设计模式————(工厂方法)
- 设计模式学习笔记(3)工厂方法
- <C/C++ 版> 设计模式 学习之 工厂模式 <2>
- <C/C++ 版> 设计模式 学习之 策略模式+工厂模式
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- 浅谈C++设计模式之工厂方法(Factory Method)
- 设计模式学习笔记四:工厂方法(Factory Method)
- C++设计模式-工厂方法
- 【软考学习】设计模式——工厂方法
- 设计模式学习笔记:抽象工厂和工厂方法的区别
- 工厂方法模式【设计模式学习-05】
- 设计模式C++学习笔记之九(Template Method模板方法模式)
- 学习设计模式:工厂方法——简单工厂只是我的另一相
- <C/C++ 版> 设计模式 学习之 工厂模式 <1>
- 设计模式学习笔记-工厂方法
- 跟着实例学习设计模式(5)-工厂方法 、抽象工厂的区别