23种设计模式(七)对象创建之工厂方法
本系列所有文章来自李建忠老师的设计模式笔记,系列如下:
设计模式(一)面向对象设计原则
23种设计模式(二)组件协作之模板方法
23种设计模式(三)组件协作之策略模式
23种设计模式(四)组件协作之观察者模式
23种设计模式(五)单一职责之装饰模式
23种设计模式(六)单一职责之桥模式
23种设计模式(七)对象创建之工厂方法
23种设计模式(八)对象创建之抽象工厂
23种设计模式(九)对象创建之原型模式
23种设计模式(十)对象创建之构建器
23种设计模式(十一)对象性能之单件模式
23种设计模式(十二)对象性能之享元模式
23种设计模式(十三)接口隔离之门面模式
23种设计模式(十四)接口隔离之代理模式
23种设计模式(十五)接口隔离之适配器
23种设计模式(十六)接口隔离之中介者
23种设计模式(十七)状态变化之状态模式
23种设计模式(十八)状态变化之备忘录
23种设计模式(十九)数据结构之组合模式
23种设计模式(二十)数据结构之迭代器
23种设计模式(二十一)数据结构之职责链
23种设计模式(二十二)行为变化之命令模式
23种设计模式(二十三)行为变化之访问器
23种设计模式(二十四)领域规则之解析器
文章目录
- 动机
- 设计方法一
- 设计方法二
- 模式定义
- 要点总结
通过“对象创建” 模式绕开new
,来避免对象创建(new)过程
中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它
是接口抽象之后的第一步工作。
动机
在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
设计方法一
- FileSplitter1.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{};
上述代码是面向接口编程工作的一部分。之前所说的模式都有一个抽象基类,之后采用ISplitter * splitter= new BinarySplitter();
方式实现面向接口编程。
- MainForm1.cpp
class MainForm : public Form
{TextBox* txtFilePath;TextBox* txtFileNumber;ProgressBar* progressBar;public:void Button1_Click(){ISplitter * splitter= new BinarySplitter();//依赖具体类splitter->split();}
};
面向接口编程最简单的一个表现形式就是变量要声明成抽象基类。
这里MainForm1
中的ISplitter * splitter
是依赖于抽象,但是new BinarySplitter();
依赖于细节同样不行。
如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
设计方法二
那能不能用一种方法来返回一个对象:
- ISplitterFactory.cpp
//抽象类
class ISplitter{public:virtual void split()=0;virtual ~ISplitter(){}
};//工厂基类
class SplitterFactory{public:virtual ISplitter* CreateSplitter()=0;virtual ~SplitterFactory(){}
};
- 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();}
};
- MainForm2.cpp
class MainForm : public Form
{SplitterFactory* factory;//工厂public:MainForm(SplitterFactory* factory){this->factory=factory;}void Button1_Click(){ISplitter * splitter=factory->CreateSplitter(); //多态newsplitter->split();}
};
模式定义
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method
使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。
要点总结
Factory Method
模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
Factory Method
模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
Factory Method
模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。
23种设计模式(七)对象创建之工厂方法相关推荐
- 23种设计模式----原型模式----创建型模式
原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...
- java与23种设计模式
1 23种设计模式分类 经典的<设计模式>一书归纳出23种设计模式,本文按<易学设计模式>一书归纳分类如下: 1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面 ...
- C++23种设计模式(1)-工厂方法模式
C++常用的设计模式有23种. 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享 ...
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- PHP 完整实战23种设计模式
PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者模式 PHP实战结构型模式 桥接模式 享元模式 外观模式 适配器模式 装饰器模式 组合模式 代理模式 过滤器模式 PHP实战行为 ...
- 快来,这里有23种设计模式的Go语言实现
摘要:设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. 本文分享自华 ...
- Java的7大设计原则和23种设计模式
目录 一.UML类图 二. 设计原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则-最少知道原则 6.开闭原则 7.组合/聚合复用原则 三.Java中的23 ...
- 23种设计模式-个人笔记(二)
目录 五.23 种设计模式 1.单例模式 1.1.单例模式的定义与特点 1.2.单例模式的优点和缺点 1.3.单例模式的应用场景 1.4.单例模式的结构与实现 1.5.八种方式详解 1.6.单例模式在 ...
- Java内功修炼 - 23种设计模式
一个设计模式的出现一定有它特殊的价值 前段时间二刷Java设计模式 对于设计模式来说,这个东西是始终不变的,所以我把这方面知识归纳为Java内功. 一个技术超牛的程序员,也就和修仙类小说男主角一样.不 ...
- 23种设计模式应用场景
23种设计模式应用场景 创建型模式 工厂方法模式: 原型模式:clone/fork子线程 建造者模式:框架组件实例化 抽象工厂模式:业务+反射 单例模式:只读单实例场景 结构型模式 装饰模式:换装软件 ...
最新文章
- ISP、IAP、ICP的区别!
- 斯坦福大学机器学习第十课“应用机器学习的建议(Advice for applying machine learning)”
- 解决Eclipse中文乱码的方法
- 【English Email】CIP payouts now in Workday
- mysql 5.5.41 下载_MySQL 5.5.41/5.6.22 发布下载
- 中科大计算机本科毕业论文范文,中国科大本科生毕业论文管理再上新台阶
- 9种让肌肤美白的简单方法 - 生活至上,美容至尚!
- 猎豹MFC--图片控件CStatic和动画控件CAnimateCtrl
- ESRI.ArcGIS.Controls.AxMapControl
- Boruta特征筛选
- linux闹钟命令,Linux基础命令一
- html range样式修改,自定义(滑动条)input[type=range]样式
- Android gallery 3D效果
- 干货!技术分享:如何写好一篇论文
- 乐优商城之后台管理系统
- 计及碳捕集电厂低碳特性的含风电电力系统源–荷多时间尺度调度方法(Matlab代码实现)
- 嬉皮笑脸面对明天的“难”
- OpenCV Java入门六 使用神经网算法辩识人脸
- 到场率高达96% 这才是高水准技术大会应该有的样子
- 嗯,农民伯伯的2014就是这些