Head First 设计模式 —— 04. 工厂 (Factory) 模式
思考题
如何将实例化具体类的代码从应用中抽离,或者封装起来,使它们不会干扰应用的其他部分? P111
- 将实例化具体类的代码放入一个对象中管理,通过不同入参决定实例化具体的类
简单工厂
不是23种GOF设计模式之一,而更像一种编程习惯。 P117

特点
- 通常利用静态方法创建实例,但这样无法通过继承来改变创建方法的行为。
P115
缺点
- 违反开闭原则,增加产品时需要修改工厂类。
工厂方法模式
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。 P134

特点
- 工厂方法让类把实例化推迟到子类。
P134 - “决定”指选用哪个子类,就决定了实际创建哪个子类。
P134 - 增加产品或改变产品的实现,不会影响工厂接口。
P135
缺点
- 新增产品时,需要增加新的工厂,增加代码复杂性。
抽象工厂模式
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 P156

特点
- 抽象工厂的方法经常以工厂方法的方式实现。
P158 - 把一群相关的产品集合起来。
P159
缺点
- 新增新的相关产品时,需要修改接口和实现类。
P159
设计原则
- 依赖倒置原则:要依赖抽象,不依赖具体类。
P139- 不能让高层组件依赖低层组件,并且不管高层组件或低层组件,都应该依赖于抽象。
P139 - 低层组件依赖于高层抽象。
P141 - 避免违反依赖倒置原则的指导方针(可根据实际情况尽量遵循)
P143- 变量不可以持有具体类的引用
- 即没有
import具体类,可以使用工厂避免具体类的引用
- 即没有
- 不要让类派生自具体类
- 【书上解释】使用时可能会依赖具体类,可是让类派生自接口或抽象类
- 【自己想法】只要具体类派生自接口或抽象类,就可以让类派生自该具体类
- 不要覆盖基类中已实现的方法
- 【书上解释】基类中已实现的方法,应该由所有的子类共享
- 【自己想法】书上前面也提到基类可以提供默认的方法,子类可以覆盖为自己的实现
P135
- 变量不可以持有具体类的引用
- 不能让高层组件依赖低层组件,并且不管高层组件或低层组件,都应该依赖于抽象。
所思所想
- 其实平时写代码时很多时候都倒置了自己的思考方式,比如:依赖某个接口的不同实现完成不同的小功能时,不会先去写具体的实现,而是根据接口先完成上层的代码框架,再具体完成每一个实现类。
- 虽然书中说了工厂方法和抽象工厂的区别,但还是感觉两个区别不大,只是在应用场景有点区别。工厂方法指创建一类产品,而抽象工厂关键相关的多类产品。当相关的产品只有一类时,抽象工厂就是工厂方法。
本文首发于公众号:满赋诸机(点击查看原文) 开源在 GitHub :reading-notes/head-first-design-patterns
Head First 设计模式 —— 04. 工厂 (Factory) 模式的更多相关文章
- [设计模式3]--工厂(Factory)模式
原文出处:http://blog.csdn.net/lwbeyond/article/details/7528309 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式 ...
- 设计模式--简单工厂(Factory)模式
温故而知新,看了以前写的博文<Asp.net读取Excel文件 2>http://www.cnblogs.com/insus/archive/2011/05/05/2037808.html ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- Java设计模式之工厂方法模式(转) 实现是抽象工厂?
Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织 2009-02-25 来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章] ...
- php设计模式之工厂方法模式
php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...
- C#设计模式(3)——工厂方法模式
一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...
- C#设计模式(3)——工厂方法模式(转)
C#设计模式(3)——工厂方法模式 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...
- 设计模式04: Factory Methord 工厂方法模式(创建型模式)
Factory Methord 工厂方法模式(创建型模式) 从耦合关系谈起耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之变更 -模块与模块之间的 ...
- C#设计模式-2工厂方法模式(Factory Method)
什么是工厂模式?类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买.但在程序设计中,当我们需要调用一个类(PhoneA或PhoneB)的方法的时候,我们往 ...
随机推荐
- 第15.25节 PyQt(Python+Qt)入门学习:Model/View开发实战--使用QTableView展示Excel文件内容
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 在前面的订阅专栏<第十九章.Model/View开发:QTableView的功能及属 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的windowTitle和windowOpacity属性
windowOpacity 这个属性仅对window对象生效. windowOpacity为浮点数,表示透明度,为1完全不透明,为0完全透明,缺省是1. 可以通过windowOpacity().set ...
- 从Linux源码看Socket(TCP)的accept
从Linux源码看Socket(TCP)的accept 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...
- ATT&CK 实战 - 红日安全 vulnstack (一) 靶机渗透
关于部署:https://www.cnblogs.com/Cl0ud/p/13688649.html PS:好菜,后来发现内网主机还是PING不通VM1,索性三台主机全部配成NAT模式,按照WEB靶机 ...
- Mac上特殊方式启动Parallels Desktop 16.0.0 (48916)
背景: mbp升级到Big Sur版本,Parallels Desktop使用到是16.0.0 (48916)版本,然而由于兼容性问题,Parallels Desktop截止当前无法正常使用. 网上搜 ...
- 6种css3 transform图片悬停动态效果
html骨架代码 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...
- Scrum 冲刺第七天
一.每日站立式会议 1.会议内容 1)进行每日工作汇报 张博愉: 昨天已完成的工作:与林梓琦同学完成发帖模块的交接 今日工作计划:完善发帖模块的点赞.上传图片功能 工作中遇到的困难:Mybatis的一 ...
- 精尽Spring MVC源码分析 - WebApplicationContext 容器的初始化
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- MySQL事务提交流程
有binlog的CR方式(重点核心!!): 有binlog情况下,commit动作开始时,会有一个Redo XID 的动作记录写到redo,然后写data到binlog,binlog写成功后,会将bi ...
- Web服务器-正则表达式-小例子(3.1.2)
@ 目录 1.邮箱 2.手机号码 关于作者 1.邮箱 import re def main(): email = input("请输入一个邮件地址:") ret = re.matc ...
