专栏首页烟草的香味23种设计模式之工厂方法模式

23种设计模式之工厂方法模式

工厂方法模式的定义

定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂方法使一个类的实例化延迟到其子类

工厂方法模式的通用类图:

其中 Product 负责产品的共性,实现对事物最抽象的定义; Creator 为抽象创建类, 也就是抽象工厂, 具体如何创建产品类是由具体的实现工厂 ConcreteCreator 完成的. 下面给出他们的代码:

产品抽象类代码:

具体产品类继承自抽象产品类,抽象工厂负责定义产品对象的产生,代码如下;

具体工厂类的实现代码如下:

工厂方法模式的优点

  1. 良好的封装性,代码结构清晰. 一个对象创建是有条件约束的, 如一个调用者需要一个具体的产品对象,只要知道产品的类名就可以了, 不用知道对象是如何创建的,降低模块间的耦合
  2. 工厂方法模式的扩展性非常优秀. 在增加产品类的情况下, 只要适当的修改具体的工厂类或扩展一个工厂类, 就可以完成"拥抱变化".
  3. 屏蔽产品类. 产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口, 只要接口保持不变, 系统中的上层模块就不用发生变化. 因为产品类的实例化是由工厂类负责的,一个产品对象具体由哪一个产品生成是由工厂类决定的.
  4. 工厂方法模式是典型的解耦框架. 高层模块只需要知道产品的抽象类, 其他的实现类都不用关心.

工厂方法模式的使用场景

  1. 工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是要考虑是否要增加一个工厂类进行管理,增加代码复杂度
  2. 需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式.
  3. 工厂方法模式可以用在异构项目中,
  4. 可以使用在测试驱动开发的框架下. 例如, 测试一个类A,就需要把与类A有关联关系的类B也同时生产出来,我们可以使用工厂方法模式把类B虚拟出来,避免类A与类B的耦合.

工厂方法模式的扩展

工厂方法模式有很多扩展,而且与其他模式结合使用威力更大,下面介绍四种扩展

1.缩小为简单工厂模式

一个模块仅需要一个工厂类,那就没有必要把他产生出来,使用静态方法就可以了,在使用的时候也就不用将类实例化, 直接使用即可. 调用者也比较简单, 缺点是工厂类的扩展比较困难, 不符合开闭原则

2.升级为多个工厂类

当我们在做一个比较复杂的项目时,经常会遇到初始化一个对象很耗费精力的情况,所有的产品类都放到一个工厂方法中进行初始化会使代码结构不清晰. 考虑到需要结构清晰, 我们为每个产品定义一个创造者, 好处是创建类的职责清晰,而且结构简单, 但是给可扩展性和可维护性带来了一定的影响. 当然, 在复杂的应用中一般采用多工厂的方法, 然后再增加一个协调类, 避免调用者与各个子工厂交流,协调类的作用是封装子工厂类,对高层模块提供统一的访问接口.

3.替代单例模式

当类的构造方法为私有时, 可以通过反射来创建一个实例,然后通过工厂获得该类的唯一实例

4.延迟初始化

就是一个对象被消费完毕后,并不立刻释放,工厂类保持其初始状态,等待再次被使用.

延迟加载框架是可以扩展的, 例如限制某一个产品类的最大实例化数量,可以通过判断Map中已有的对象数量来实现,这样的处理是非常有意义的.

延迟加载还可以用在对象初始化比较复杂的情况下,例如硬件访问,设计多方面的交互,则可以通过延迟加载降低对象的产生和销毁带来的复杂性


工厂方法模式在项目中使用的非常频繁,以至于很多代码中都包含工厂方法模式. 而且工厂方法模式还可以与其它模式混合使用,变化出无穷的优秀设计,这也正是软件设计和开发的乐趣所在

本文分享自微信公众号 - 烟草的香味(hujing-bc),作者:胡靖哥哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 23中设计模式之抽象工厂模式

    抽象工厂类 AbstractCreator 的职责是定义 每个工厂要实现的功能,其代码如下:

    烟草的香味
  • 23种设计模式之责任链模式

    定义: 使多个对象都有机会处理请求, 从而避免了请求的发送者和接受者之间的耦合关系. 将这些对象连成一条链, 并沿着这条链传递该请求,直到有对象处理它为止

    烟草的香味
  • 计算机全加器简单实现

    用了这么久计算机, 都知道计算机有一个核心部件叫 CPU, 而 CPU中有一个小部件叫做全加器. 它是用来做什么的呢? 看名字就知道了, 做加法运算用的. 那么...

    烟草的香味
  • TypeScript 设计模式之抽象工厂

    在现实生活中,工厂是负责生产产品的,比如牛奶、面包或礼物等,这些产品满足了我们日常的生理需求。

    阿宝哥
  • 大话设计模式笔记(五)——代理模式和工厂方法模式

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • Python设计模式(2):工厂方法模式

    为了克服简单工厂方法模式的缺点,人们试图改善工厂类的结构。导致简单工厂方法模式不符合开闭原则的原因是工厂方法类只是一个实类,每当有一个新的产品类被加入到产品类的...

    不可言诉的深渊
  • 工厂方法模式(Factory Method)-最易懂的设计模式解析

    在上文提到的最易懂的设计模式系列解析:简单工厂模式,发现简单工厂模式存在一系列问题:

    Carson.Ho
  • 设计模式(四):从“兵工厂”中探索简单工厂、工厂方法和抽象工厂模式

    前面陆陆续续的更新了三篇关于设计模式的博客,是关于“策略模式”、“观察者模式”、“装饰者模式”的,今天这篇博客就从“兵工厂”中来探索一下“工厂模式”(Facto...

    lizelu
  • 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式...

    Dato
  • 「镁客·请讲」云工厂李钦:紧抓行业痛点,做工业制造业的“京东”

    镁客网

扫码关注云+社区

领取腾讯云代金券