思考题

如何将实例化具体类的代码从应用中抽离,或者封装起来,使它们不会干扰应用的其他部分? 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) 模式的更多相关文章

  1. [设计模式3]--工厂(Factory)模式

    原文出处:http://blog.csdn.net/lwbeyond/article/details/7528309 工厂模式属于创建型模式,大致可以分为三类,简单工厂模式.工厂方法模式.抽象工厂模式 ...

  2. 设计模式--简单工厂(Factory)模式

    温故而知新,看了以前写的博文<Asp.net读取Excel文件 2>http://www.cnblogs.com/insus/archive/2011/05/05/2037808.html ...

  3. 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)

    原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...

  4. Java设计模式之工厂方法模式(转) 实现是抽象工厂?

    Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站   文本Tag: 设计模式 Java [IT168 技术文章]         ...

  5. php设计模式之工厂方法模式

    php设计模式之工厂方法模式 工厂方法模式 工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Pol ...

  6. C#设计模式(3)——工厂方法模式

    一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary&g ...

  7. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...

  8. 设计模式04: Factory Methord 工厂方法模式(创建型模式)

    Factory Methord 工厂方法模式(创建型模式) 从耦合关系谈起耦合关系直接决定着软件面对变化时的行为 -模块与模块之间的紧耦合使得软件面对变化时,相关的模块都要随之变更 -模块与模块之间的 ...

  9. C#设计模式-2工厂方法模式(Factory Method)

    什么是工厂模式?类比生活中的概念,当我们需要打电话的时候,我们需要一部手机,我们通常会选择直接去卖手机的实体店买.但在程序设计中,当我们需要调用一个类(PhoneA或PhoneB)的方法的时候,我们往 ...

随机推荐

  1. hitorMiss、hitAndMiss以及MORPH_HITMISS?

    hitorMiss.hitAndMiss在图像处理中都是同一个概念,即图像的形态学变换中的击中击不中变换,hit表示击中,miss表示击不中.MORPH_HITMISS是OpenCV调用时该变换的op ...

  2. 熊海CMS xhcms v1.0代码审计

    有空的时候就进行小型CMS的代码审计,这次审计的对象是熊海CMS v1.0 本地环境安装好了之后,可以看到提示安装了锁文件 说明重装漏洞应该不会存在了,这时候丢进seay代码审计系统的代码也出结果了, ...

  3. 浅谈php反序列化漏洞

    关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...

  4. burp添加插件

    困扰了我很长时间的验证码,虽然迫使我早就找到了相关文章,但是由于一些原因,就推迟了验证码相关的东西.今天趁着晚上,好好的安装一下 下载地址 https://github.com/bit4woo/reC ...

  5. Scrum 冲刺 第二篇

    Scrum 冲刺 第二篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...

  6. 对象存储COS全球加速助力企业出海

    近年来,中国互联网行业迅猛发展,国内庞大的市场孕育出了许多现象级的产品,也锤炼出了非常成熟的产业链.与此同时,很多海外市场还处于萌芽期,存在着巨大的流量红利,越来越多的互联网企业开始加速"出 ...

  7. AcWing 407. 稳定的牛分配

    大型补档计划 题目链接 题目看的有点晕(语文差) 总体来说就是让每头牛找个谷仓,不能超过容量,最小化每头牛在的谷仓在自己心目中排名的极差. 显然这个最优性问题不好做,但是转换为判定性问题这就是一个标准 ...

  8. AcWing 361. 观光奶牛

    01规划 设答案为 \(ans\). 二分答案,设当前二分值为 \(mid\). 设一个环 \(S\) 的边权为 \(t_1, t_2, t_3...\),点权为 \(f_1, f_2, f_3... ...

  9. 第二章、 Centos 6.8安装 Docker

    2.1检查Docker的先决条件 64位 CPU计算机(x86_64),不支持32位 CPU 运行Linux 3.8 或更高版本内核. 内核必须支持一种合适的存储驱动(storage driver), ...

  10. rman删除归档日志无法释放

    背景 当Oracle 归档日志满了后,将无法正常登入oracle,需要删除一部分归档日志才能正常登入ORACLE.最近遇到一个问题,一套Oracle 11g数据库使用RMAN删除了归档日志,但是仍然无 ...