【设计模式】工厂方法

news/2025/1/14 9:35:42/

工厂方法设计模式引入

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

在这里插入图片描述

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

初始设计代码问题分析

  • 代码中在咖啡店类直接 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 框架底层运用工厂方法设计模式管理对象创建和依赖注入。

http://www.ppmy.cn/news/1562996.html

相关文章

Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库

Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库 目录 Oracle Dataguard(主库为双节点集群)配置详解(4):配置备库一、为备库配置静态监听1、配置 li…

Kafka优势剖析-流处理集成

目录 1. Kafka Streams API 1.1 什么是 Kafka Streams API? 1.2 Kafka Streams 的工作原理 1.3 Kafka Streams 的优势 1.4 Kafka Streams 的典型应用场景 2. KSQL 2.1 什么是 KSQL? 2.2 KSQL 的工作原理 2.3 KSQL 的优势 Kafka 的流处理能力是其…

【物流管理系统 - IDEAJavaSwingMySQL】基于Java实现的物流管理系统导入IDEA教程

有问题请留言或私信 步骤 下载项目源码:项目源码 解压项目源码到本地 打开IDEA 左上角:文件 → 新建 → 来自现有源代码的项目 找到解压在本地的项目源代码文件,点击确定,根据图示步骤继续导入项目 查看项目目录&#xff…

Redis十大数据类型详解

Redis(一) 十大数据类型 redis字符串(String) string是redis最基本的类型,一个key对应一个value string类型是二进制安全的,意思是redis的string可以包含任何数据。例如说是jpg图片或者序列化对象 一个re…

02.05、链表求和

02.05、[中等] 链表求和 1、题目描述 给定两个用链表表示的整数,每个节点包含一个数位。 这些数位是反向存放的,也就是个位排在链表首部。 编写函数对这两个整数求和,并用链表形式返回结果。 2、解题思路 本题要求对两个链表表示的整数…

反弹SHELL不回显带外正反向连接防火墙出入站文件下载

什么是反弹shell 正向连接正向连接(Forward Connection):正向连接是一种常见的网络通信模式,其中客户端主动发起连接到服务器或目标系统。正向连接通常用于客户端-服务器通信,客户端主动请求服务或资源,例如…

Python的循环

Python的循环 Python的循环有两种,分别是for…in循环和while循环。 for…in 循环 假设我们要循环输出一个列表里的元素: names [张三,李四,王五] for name in names:print(name)执行这段代码后,会依次打印names的每一个元素:…

Pathview包:整合表达谱数据可视化KEGG通路

Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包,其会先下载KEGG官网上的通路图,然后整合输入数据对通路图进行再次渲染,从而对KEGG通路图进行一定程度上的个性化处理,并且丰富其信息展示。(KEGG在线数…