极客充电队在2025年10月11日进行了读书活动分享,极客充电队本次计划集体阅读《Head First 设计模式》第二版,梳理自己对工厂模式结合面向对象的认识,温故而知新,在理论结合实际过程中加深对于工厂模式的理解。
概述:通过对书中工厂模式阅读主要是讲解了工厂模式定义,工厂模式分类,工厂模式的使用场景和使用工厂模式目的为主题结合了披萨店的案例进行讲解,其中工厂模式很好的遵循了面向对象三大特性:封装,继承,多态特性和遵循了依倒置原则,开闭原则两大原则。
- 工厂模式定义:首先工厂模式是创建型模式(创建型,结构型,行为型)
- 开闭原则:工厂方法和抽象工厂很好的遵守了开闭原则,对修改关闭,对新增开放,扩展性比较强,新的变化新增产品类实现,整个调用架构不用修改。
- 依赖倒置原则:工厂模式很好的遵守了依赖导致原则,就是调用方只依赖接口或抽象,不依赖具体实现,实现也依赖接口和抽象不依赖调用方,都依赖接口和抽象。
- 工厂模式分类:
- 简单工厂:简单工厂并不是一种标准工厂模式,只是一种编码习惯,简单工厂不具备工厂模式特性,原因是:他没有遵循开闭原则,简单工厂特点是比较简单,只是具体产品对象的创建的封装,简单工厂使用场景:产品种类较少无需频繁扩展场景,日常编码中简单工厂日常实用比较常见,如下UML图就是一个简单工厂

- 工厂方法:工厂方法模式定义了一个创建对象抽象方法,但由子类决定实例化哪个类。工厂方法将对象的创建延迟到子类,工厂方法实际上对创建单个产品的抽象,工厂方法使用场景:产品种类多,需要动态扩展场景,日常编码中用的比较少,主要是还是缺少面向对象编码的思维,如下UML图就是一个工厂方法

- 抽象工厂:提供一个接口来创建相关或依赖对象的家族,而不需要指定具体的类,抽象工厂是对创建有关联的产品族的抽象,使用场景:产品族之间存在强关联的场景,如下UML图就是一个抽象工厂
优点:
调用者只需要知道对象的名称即可创建对象。扩展性高,如果需要增加新产品,只需扩展一个工厂类即可。屏蔽了产品的具体实现,调用者只关心产品的接口。抽象工厂确保同一产品族的对象一起工作。抽象工厂客户端不需要知道每个对象的具体类,简化了代码。缺点:
每次增加一个产品时,都需要增加一个具体类和对应的工厂,使系统中类的数量成倍增加,增加了系统的复杂度和具体类的依赖。抽象工厂扩展产品族非常困难。增加一个新的产品族需要修改抽象工厂和所有具体工厂的代码。
总结:个人对于工厂模式的理解,本质解决就是对象创建的封装,不管是简单工厂,工厂方法,抽象工厂只是封装场景不一样,最终本质就是对象创建的封装抽象,实现了对象创建和使用分离,最终实现系统扩展性和可维护性。
应用:充电在进行5.0设计时,曾经用到工厂模式案例设计思想,如下截图:
