【设计模式】工厂方法

工厂方法设计模式引入

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

  • 工厂方法设计模式分为简单工厂、工厂方法和抽象工厂三个小类。以咖啡店点餐系统为案例展开讲解。
  • 咖啡店点餐系统初始设计包含咖啡类(可为抽象类或接口)及其子类美式咖啡和拿铁咖啡,还有咖啡店类。咖啡类有获取名字、添加牛奶、加糖等方法,子类重写这些方法。咖啡店类可点咖啡并操作配料。
  • 从类图角度,介绍了类的表示方法,如类名、属性、方法的位置,以及继承(泛化关系用实心三角箭头线表示)、实现(接口与实现类用虚线空心三角箭头线表示)、依赖(虚线箭头线表示)关系在类图中的体现,咖啡店类依赖咖啡类或接口。

初始设计代码问题分析

  • 代码中在咖啡店类直接 new 咖啡对象,导致对对象耦合严重。若更换对象,所有 new 处都需修改,违背开闭原则(对扩展开放,对修改关闭)。

简单工厂模式

  • 角色与原理 :包含抽象产品、具体产品和具体工厂三个角色。在咖啡店案例中,将对象创建从咖啡店类转移到 simple coffee factory 工厂类。工厂类根据传入参数返回不同咖啡对象,咖啡店类通过与工厂类交互获取对象,解除了咖啡店类和咖啡实现类的直接耦合。
  • 代码实现 :在 simple coffee factory 类中定义 createcoffee 方法,根据参数 new 出相应咖啡对象。咖啡店类中先 new 工厂对象,再调用其 createcoffee 方法获取咖啡对象,并可进行后续配料操作。
  • 优缺点:优点是一定程度上解耦;缺点是产生了咖啡店类与工厂类、工厂类与咖啡实现类的耦合,且后期新增咖啡品种时需修改工厂类,违反开闭原则。

简单工厂模式虽有改进但存在不足


一、从简单工厂到工厂方法设计模式的引出

  • 简单工厂存在缺点,当有新增咖啡种类时会违反开闭原则。
  • 工厂方法设计模式可解决此问题,完全遵循开闭原则。

二、工厂方法设计模式的角色

  • 抽象产品:如咖啡接口,定义产品规范,包括特性和功能,有多个方法。
  • 具体产品 :如 american cyletter cafe,是咖啡接口的实现类。
  • 抽象工厂coffee factory 接口,定义创建产品的规范,即工厂方法。
  • 具体工厂american coffee factorylatter coffee factory,分别创建对应的具体产品,实现抽象工厂接口。

三、工厂方法设计模式的代码实现

  • 产品类coffee 类为抽象产品,有 letter copy(拿铁咖啡)和 american copy(美式咖啡)等实现类。
  • 工厂类coffee factory 接口有创建咖啡的方法,由两个实现类分别创建不同产品,american copy factory 创建美式咖啡,latter coffee factory 创建拿铁咖啡。
  • 咖啡店类coffee store 类通过构造函数接收工厂对象,older coffee 方法根据传入的工厂创建相应咖啡对象,并可添加配料,切换产品只需更换传入的工厂,无需改动其他代码。

四、工厂方法设计模式的优缺点

  • 优点
    • 遵循开闭原则,添加新产品时只需添加新产品的工厂和具体产品类,无需修改已有代码。
    • 用户只需知道工厂名称就能得到对应产品,无需了解对象创建过程。
  • 缺点:每新增一个产品都要创建对应的工厂和产品类,增加了系统复杂度。

工厂方法设计模式的局限

  • 介绍了工厂方法设计模式遵循开闭原则且实现对象解耦,但在业务复杂时存在不足。
  • 其只能解决同类产品创建,如仅能创建咖啡或电视等单一类型产品。当需要同时创建不同类产品(如电脑和手机)时,该模式难以应对。

抽象工厂设计模式的引入

  • 为解决复杂需求,引出抽象工厂设计模式,并介绍产品组和产品等级概念。
  • 产品组指一个品牌下所有产品,如华为的电脑和手机;产品等级指多个品牌下同种产品,如各品牌的手机或电脑。
  • 抽象工厂模式是工厂方法模式的升级,可生产多个等级产品,被称为超级工厂或其他工厂的工厂。

抽象工厂设计模式的示例

  • 以咖啡店业务升级为例,咖啡店不仅生产咖啡(美式、拿铁),还生产甜点(提拉米苏、抹茶慕斯)。
  • 按产品等级,咖啡和甜点是不同分类;按产品组,美式风味包含美式咖啡和抹茶慕斯,意大利风味包含拿铁和提拉米苏。

抽象工厂设计模式的类图结构

  • 定义甜品接口和咖啡接口,分别有对应的实现类(提拉米苏、抹茶慕斯、美式咖啡、拿铁)。
  • 提供抽象产品工厂接口,定义创建咖啡和甜点对象的规范。
  • 有具体工厂类(意大利风味工厂、美式风味工厂)实现抽象产品工厂接口,并重写创建方法,咖啡店依赖产品工厂生产产品。

抽象工厂设计模式的优缺点

  • 优点:当产品组中多个对象需协同工作时,能确保客户端始终使用同一产品集中的对象,如获取拿铁和提拉米苏可通过意大利风味工厂创建。
  • 缺点:若产品组新增产品,所有工厂类都需修改,增加维护成本。

三种工厂设计模式总结

  • 简单工厂:并非严格设计模式,是编程习惯。所有产品共用一个工厂,新增产品需改代码,违反开闭原则,但编程思路可借鉴。
  • 工厂方法设计模式:为每个产品提供专门工厂生产,遵循开闭原则,在项目中应用广泛。
  • 抽象工厂设计模式:适用于多维度产品配合生产,但在企业开发中使用较少。

工厂设计模式的核心目的与应用实例

  • 工厂设计模式主要用于解耦对象创建关系,降低耦合度。如 Spring 框架底层运用工厂方法设计模式管理对象创建和依赖注入。
相关推荐
duapple3 小时前
Golang基于反射的ioctl实现
开发语言·后端·golang
Dxy12393102163 小时前
Python 条件语句详解
开发语言·python
字节源流4 小时前
关于maven的依赖下不下来的问题
java·maven
pjx9875 小时前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
prinrf('千寻)5 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
老华带你飞5 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
m0_555762905 小时前
Qt缓动曲线详解
开发语言·qt
在未来等你6 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
源码技术栈6 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
编程、小哥哥6 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧