本系列所有文章来自李建忠老师的设计模式笔记,系列如下:
设计模式(一)面向对象设计原则
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种设计模式(七)对象创建之工厂方法相关推荐

  1. 23种设计模式----原型模式----创建型模式

    原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...

  2. java与23种设计模式

    1 23种设计模式分类 经典的<设计模式>一书归纳出23种设计模式,本文按<易学设计模式>一书归纳分类如下: 1.创建型模式 前面讲过,社会化的分工越来越细,自然在软件设计方面 ...

  3. C++23种设计模式(1)-工厂方法模式

    C++常用的设计模式有23种. 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享 ...

  4. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  5. PHP 完整实战23种设计模式

    PHP实战创建型模式 单例模式 工厂模式 抽象工厂模式 原型模式 建造者模式 PHP实战结构型模式 桥接模式 享元模式 外观模式 适配器模式 装饰器模式 组合模式 代理模式 过滤器模式 PHP实战行为 ...

  6. 快来,这里有23种设计模式的Go语言实现

    摘要:设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. 本文分享自华 ...

  7. Java的7大设计原则和23种设计模式

    目录 一.UML类图 二. 设计原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则-最少知道原则 6.开闭原则 7.组合/聚合复用原则 三.Java中的23 ...

  8. 23种设计模式-个人笔记(二)

    目录 五.23 种设计模式 1.单例模式 1.1.单例模式的定义与特点 1.2.单例模式的优点和缺点 1.3.单例模式的应用场景 1.4.单例模式的结构与实现 1.5.八种方式详解 1.6.单例模式在 ...

  9. Java内功修炼 - 23种设计模式

    一个设计模式的出现一定有它特殊的价值 前段时间二刷Java设计模式 对于设计模式来说,这个东西是始终不变的,所以我把这方面知识归纳为Java内功. 一个技术超牛的程序员,也就和修仙类小说男主角一样.不 ...

  10. 23种设计模式应用场景

    23种设计模式应用场景 创建型模式 工厂方法模式: 原型模式:clone/fork子线程 建造者模式:框架组件实例化 抽象工厂模式:业务+反射 单例模式:只读单实例场景 结构型模式 装饰模式:换装软件 ...

最新文章

  1. ISP、IAP、ICP的区别!
  2. 斯坦福大学机器学习第十课“应用机器学习的建议(Advice for applying machine learning)”
  3. 解决Eclipse中文乱码的方法
  4. 【English Email】CIP payouts now in Workday
  5. mysql 5.5.41 下载_MySQL 5.5.41/5.6.22 发布下载
  6. 中科大计算机本科毕业论文范文,中国科大本科生毕业论文管理再上新台阶
  7. 9种让肌肤美白的简单方法 - 生活至上,美容至尚!
  8. 猎豹MFC--图片控件CStatic和动画控件CAnimateCtrl
  9. ESRI.ArcGIS.Controls.AxMapControl
  10. Boruta特征筛选
  11. linux闹钟命令,Linux基础命令一
  12. html range样式修改,自定义(滑动条)input[type=range]样式
  13. Android gallery 3D效果
  14. 干货!技术分享:如何写好一篇论文
  15. 乐优商城之后台管理系统
  16. 计及碳捕集电厂低碳特性的含风电电力系统源–荷多时间尺度调度方法(Matlab代码实现)
  17. 嬉皮笑脸面对明天的“难”
  18. OpenCV Java入门六 使用神经网算法辩识人脸
  19. 到场率高达96% 这才是高水准技术大会应该有的样子
  20. 嗯,农民伯伯的2014就是这些

热门文章

  1. CentOS 关闭蜂鸣器声音
  2. shell编程之正则表达式与文本工具
  3. 二叉树中和为某一值的路径(一)(C++)
  4. 游戏筑基之选择分支语句(C语言)
  5. Vulnhub-HackInOS
  6. (转)kafka 详解
  7. (二)Luence——代码实现索引及搜索
  8. 代码故事:汉德的救赎
  9. python模块之httplib(在py3中功能进一步强大,请详看文档)
  10. 实现两个N*N矩阵的乘法,矩阵由一维数组表示