8 设计模式之简单工厂模式

devtools/2024/11/30 1:16:49/

        设计模式是软件开发中的一套通用解决方案,而简单工厂模式则是最基础、最常用的一种创建型模式。在这篇博客中,我将为大家详细介绍简单工厂模式的概念、优缺点,以及通过一个饮料制作的案例,帮助大家更好地理解和应用这种模式。


一、简单工厂模式是什么?

        简单工厂模式是一种一个工厂类 根据传入的参数,动态决定创建哪种产品类实例的设计模式。虽然简单工厂不属于 GOF(四人帮)提出的23种设计模式之一,但它是工厂模式家族的重要成员。

1.简单工厂的组成:

  • 工厂类(Factory Class):
    提供创建具体产品的功能,负责封装实例化逻辑。
  • 抽象产品类(Product Interface/Abstract Class):
    定义产品的共性行为,是具体产品类的父类或接口。
  • 具体产品类(Concrete Product Classes):
    实现或继承抽象产品类,包含具体的产品功能。

2.简单工厂的优缺点:

优点:

  • 客户端无需关心对象的创建细节,只需通过工厂获取对象即可,符合 "单一职责原则"
  • 实现了对象的创建与使用分离。

缺点:

  • 增加新的产品时,工厂类需要修改逻辑,不符合 "开闭原则"(对扩展开放,对修改关闭)。
  • 工厂类的职责较重,可能造成类的复杂度增加。

二、案例:饮料制作工厂

1.需求描述:

        我们需要设计一个饮料制作工厂,可以根据用户需求制作不同类型的饮料,包括咖啡、茶水和果汁。用户输入饮料类型后,工厂动态创建对应的饮料对象,并执行制作方法。

2.具体代码

(1)抽象产品类:Drink

java">abstract class Drink {public abstract void make(); // 定义统一的制作方法
}

(2)具体产品类:CoffeeTeaJuice

java">public class Coffee extends Drink {@Overridepublic void make() {System.out.println("咖啡制作中");}
}public class Tea extends Drink {@Overridepublic void make() {System.out.println("茶水制作中");}
}public class Juice extends Drink {@Overridepublic void make() {System.out.println("果汁制作中");}
}

(3)工厂类:DrinkFactory

java">public class DrinkFactory {public static Drink createDrink(String type) {if ("咖啡".equalsIgnoreCase(type)) {return new Coffee();} else if ("茶水".equalsIgnoreCase(type)) {return new Tea();} else if ("果汁".equalsIgnoreCase(type)) {return new Juice();} else {throw new IllegalArgumentException("未知的饮料类型:" + type + "。请输入:咖啡、茶水或果汁!");}}
}

(4)测试类:SimpleFactoryTest

java">public class SimpleFactoryTest {public static void main(String[] args) {Drink coffee = DrinkFactory.createDrink("咖啡");coffee.make(); // 输出:咖啡制作中Drink tea = DrinkFactory.createDrink("茶水");tea.make(); // 输出:茶水制作中try {Drink unknown = DrinkFactory.createDrink("牛奶");unknown.make();} catch (IllegalArgumentException e) {System.out.println(e.getMessage());}}
}

(5)运行结果:

咖啡制作中
茶水制作中
未知的饮料类型:牛奶。请输入:咖啡、茶水或果汁!


三、案例解析与优化建议

1.封装逻辑:

        DrinkFactorycreateDrink() 方法封装了饮料对象的创建逻辑,客户端无需直接使用 new,只需传入饮料类型即可获得对应对象。

2.扩展性问题:

        如果需要添加新饮料,比如 "牛奶",需要修改工厂类的 createDrink() 方法逻辑。这违背了 开闭原则,但在简单需求下是可以接受的。

3.改进方向:

        使用枚举类型: 定义饮料类型为枚举常量,避免字符串硬编码导致错误。

        动态注册: 工厂可以设计为支持动态注册新产品,减少对代码的修改。


四、总结

        简单工厂模式是一种结构清晰、实现简单的设计模式,在开发中非常实用。它通过将对象的创建逻辑集中管理,使代码更具可读性和维护性。通过这次饮料制作工厂的实践,我们学会了如何应用简单工厂模式,完成了对象创建与业务逻辑的分离。

        你也可以试着实现自己的简单工厂,加入更多种类的饮料或者其它领域的场景!

        希望这篇博客能帮助到你。如果觉得有用,记得点赞、收藏哦!欢迎在评论区分享你的实现与想法! 😊


以上案例和博客内容由一次学习与实践经历整理而成,感谢每一次思考与成长!


http://www.ppmy.cn/devtools/138060.html

相关文章

数字图像处理(4):FPGA中的定点数、浮点数

(1)定点数:小数点固定在数据的某一位置的数,可以分为定点整数和定点小数和普通定点数。定点数广泛应用于数字图像处理(图像滤波、图像缩放)和数字信号处理(如FFT、定点卷积)中。 定…

HTML飞舞的爱心

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色…

详解RabbitMQ在Ubuntu上的安装

​​​​​​​ 目录 Ubuntu 环境安装 安装Erlang 查看Erlang版本 退出命令 ​编辑安装RabbitMQ 确认安装结果 安装RabbitMQ管理界面 启动服务 查看服务状态 通过IP:port访问 添加管理员用户 给用户添加权限 再次访问 Ubuntu 环境安装 安装Erlang RabbitMq需要…

Node报错:npm error code ETIMEDOUT

1、报错详细信息 npm error code ETIMEDOUT npm error syscall connect npm error errno ETIMEDOUT npm error network request to https://registry.npmjs.org/express failed, reason: connect ETIMEDOUT 104.16.1.35:443 npm error network This is a problem related to ne…

矩阵重新排列——flip类函数

f l i p flip flip类函数可将向量或矩阵按某个方向旋转 对于向量 a a a, f l i p ( a ) flip(a) flip(a)表示将向量 a a a进行翻转 向量翻转不改变方向 对于矩阵 a a a 1. f l i p ( a , 1 ) 1.flip(a,1) 1.flip(a,1)和 f l i p u d ( a ) flipud(a) flipud(a)表示按…

LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率

文章目录 背景介绍第三方大模型API 介绍LLamafactory 部署API大模型 API 调用工具类项目开源 背景介绍 第三方大模型API 目前,市面上有许多第三方大模型 API 服务提供商,通过 API 接口向用户提供多样化的服务。这些平台不仅能提供更多类别和类型的模型…

Paddle Inference部署推理(一)

一:Paddle Inference推理 简介 Paddle Inference 是飞桨的原生推理库,提供服务器端的高性能推理能力。由于 Paddle Inference 能力直接基于飞桨的训练算子,因此它支持飞桨训练出的所有模型的推理。 Paddle Inference 功能特性丰富&#xff…

Mybatis-plus 3.5.9 版本 PaginationInnerInterceptor 插件更新

于 v3.5.9 起,PaginationInnerInterceptor 已分离出来。如需使用,则需单独引入 mybatis-plus-jsqlparser 依赖 最新的 3.5.9 版本,在配置分页插件的时候,会提示原本的 PaginationInnerInterceptor 找不到这个类,需要导…