【设计模式】工厂方法

工厂方法设计模式引入

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

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

初始设计代码问题分析

  • 代码中在咖啡店类直接 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 框架底层运用工厂方法设计模式管理对象创建和依赖注入。
相关推荐
S-X-S42 分钟前
AOP实现操作日志记录
java·junit·aop
温柔了岁月.c42 分钟前
SpringAop
java·spring aop·动态代理·切面编程
My LQS1 小时前
通过 Caffeine 和 Spring Cache 的集成,实现高性能的本地缓存
java·spring·缓存
firepation1 小时前
基于 SpringBoot线上考试系统的设计与实现
java·spring boot·mysql·源码·课程设计
想要打 Acm 的小周同学呀1 小时前
若依框架--数据字典设计使用和前后端代码分析
java·vue3·数据字典·若依
这名字应该不会重复吧1 小时前
postgreSQL创建表分区
java·数据库·postgresql
南宫生1 小时前
力扣-数据结构-19【算法学习day.90】
java·数据结构·学习·算法·leetcode
极客先躯3 小时前
高级java每日一道面试题-2025年01月08日-微服务篇-负载平衡的意义什么 ?
java·微服务·成本效益·提高可靠性·优化性能·扩展能力·地理位置分布
free慢3 小时前
设计模式(观察者模式)
观察者模式·设计模式
许苑向上3 小时前
保护性暂停原理
java·保护性暂停