【设计模式】工厂方法

server/2025/1/12 8:27:04/

工厂方法设计模式引入

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

在这里插入图片描述

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

初始设计代码问题分析

  • 代码中在咖啡店类直接 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/server/157713.html

相关文章

MoEs and Transformers 笔记

ref:https://huggingface.co/blog/zh/moe#%E7%94%A8router-z-loss%E7%A8%B3%E5%AE%9A%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83 MoEs and Transformers Transformer 类模型明确表明,增加参数数量可以提高性能,因此谷歌使用 GShard 尝试将 Transformer 模型…

XML通过HTTP POST 请求发送到指定的 API 地址,进行数据回传

代码结构说明 这段代码的主要功能是: 从指定文件夹中读取所有 XML 文件。 将每个 XML 文件的内容通过 HTTP POST 请求发送到指定的 API 地址。 处理服务器的响应,并记录每个文件的处理结果。 using System; using System.IO; using System.Net; usin…

云原生练习

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容,不存在则创建一个文件将创建时间写入。 #!/bin/bash if [ -d "/tmp" ]; then echo "/tmp is exists" else mkdir /tmp fi if [ -f "/tmp/size.log" ]; then echo…

服务器登陆后有java变量

需求:在ssh服务器后,用户root 使用java会报错,没有这个变量,其实环境变量中已经有配置了,在/etc/profile 中有写变量及地址,通过source /etc/profile 命令也可以使环境变量加载上,但是ssh后不会…

【Rust自学】11.10. 集成测试

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 11.10.1. 什么是集成测试 在Rust里,集成测试完全位于被测试库的外部。集成测试…

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统,Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…

Android广播和阿里云消息推送服务

一、什么是广播? 广播(Broadcast)在Android开发中是一个重要的概念,它类似于现实生活中的广播电台,通过“大喇叭”将消息传递给所有感兴趣的接收者。广播机制在Android系统中用于在不同组件之间传递信息,是…

分布式ID—雪花算法

背景 现在的服务基本是分布式、微服务形式的,而且大数据量也导致分库分表的产生,对于水平分表就需要保证表中 id 的全局唯一性。 对于 MySQL 而言,一个表中的主键 id 一般使用自增的方式,但是如果进行水平分表之后,多…