设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用

目录

一、设计思路

1. 简单工厂模式

2. 工厂方法模式

3. 抽象工厂模式

二、UML类图(PlantUML格式)

1.简单工厂模式

2.工厂方法模式

3.抽象工厂模式

三、实现过程与结果

1. 简单工厂模式

2. 工厂方法模式

3. 抽象工厂模式

四、总结

        在面向对象设计中,工厂模式是一种常用的创建型设计模式,它通过将对象的创建逻辑集中管理,使得客户端无需直接创建对象,而是通过工厂类来获取所需的对象实例。这种设计思想不仅提高了代码的可扩展性和可维护性,还增强了系统的灵活性。本文将通过一个鼠标和键盘的商品对象创建系统,详细探讨简单工厂模式、工厂方法模式和抽象工厂模式的应用。

一、设计思路

1. 简单工厂模式

简单工厂模式通过一个统一的工厂类来创建对象,客户端通过传递类型参数来指定需要创建的对象。这种模式适合产品种类较少且不会频繁变化的场景。

  • 鼠标接口:定义鼠标的基本行为。

  • 具体鼠标类:实现无线鼠标和有线鼠标类,分别实现鼠标接口。

  • 鼠标工厂类:根据传入的类型参数创建相应的鼠标对象。

2. 工厂方法模式

工厂方法模式通过定义一个抽象工厂接口,让具体的工厂类实现该接口来创建对象。客户端通过使用抽象工厂接口,而不直接调用具体工厂类。这种模式适合产品种类较多且可能频繁变化的场景。

  • 鼠标接口:定义鼠标的基本行为。

  • 具体鼠标类:实现无线鼠标和有线鼠标类。

  • 抽象工厂接口:声明创建鼠标的方法。

  • 具体工厂类:实现抽象工厂接口,分别创建无线鼠标和有线鼠标。

3. 抽象工厂模式

抽象工厂模式通过一个抽象工厂接口来创建多个相关的产品族。具体工厂实现该接口,生产一组相关的产品。这种模式适合需要创建多个相关产品族的场景。

  • 鼠标接口:定义鼠标的基本行为。

  • 键盘接口:定义键盘的基本行为。

  • 具体产品类:实现无线鼠标、有线鼠标、无线键盘和有线键盘类。

  • 抽象工厂接口:声明创建鼠标和键盘的方法。

  • 具体工厂类:实现抽象工厂接口,分别创建无线设备(鼠标和键盘)和有线设备(鼠标和键盘)。

二、UML类图(PlantUML格式)

1.简单工厂模式

@startuml
interface Mouse {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}class MouseFactory {+ createMouse(type: String): Mouse
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory --> Mouse
@enduml

2.工厂方法模式

@startuml
interface Mouse {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}interface MouseFactory {+ createMouse(): Mouse
}class WirelessMouseFactory {+ createMouse(): Mouse
}class WiredMouseFactory {+ createMouse(): Mouse
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
MouseFactory <|.. WirelessMouseFactory
MouseFactory <|.. WiredMouseFactory
@enduml

3.抽象工厂模式

@startuml
interface Mouse {+ make()
}interface Keyboard {+ make()
}class WirelessMouse {+ make()
}class WiredMouse {+ make()
}class WirelessKeyboard {+ make()
}class WiredKeyboard {+ make()
}interface DeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}class WirelessDeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}class WiredDeviceFactory {+ createMouse(): Mouse+ createKeyboard(): Keyboard
}Mouse <|.. WirelessMouse
Mouse <|.. WiredMouse
Keyboard <|.. WirelessKeyboard
Keyboard <|.. WiredKeyboard
DeviceFactory <|.. WirelessDeviceFactory
DeviceFactory <|.. WiredDeviceFactory
@enduml

三、实现过程与结果

1. 简单工厂模式

代码实现:

public interface Mouse {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造无线鼠标");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有线鼠标");}
}public class MouseFactory {public Mouse createMouse(String type) {if ("wireless".equalsIgnoreCase(type)) {return new WirelessMouse();} else if ("wired".equalsIgnoreCase(type)) {return new WiredMouse();} else {return null;}}
}public class Demo {public static void main(String[] args) {MouseFactory factory = new MouseFactory();Mouse wirelessMouse = factory.createMouse("wireless");Mouse wiredMouse = factory.createMouse("wired");wirelessMouse.make(); // 输出:制造无线鼠标wiredMouse.make();    // 输出:制造有线鼠标}
}

2. 工厂方法模式

代码实现:

public interface Mouse {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造无线鼠标");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有线鼠标");}
}public interface MouseFactory {Mouse createMouse();
}public class WirelessMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new WirelessMouse();}
}public class WiredMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new WiredMouse();}
}public class Demo {public static void main(String[] args) {MouseFactory wirelessFactory = new WirelessMouseFactory();MouseFactory wiredFactory = new WiredMouseFactory();Mouse wirelessMouse = wirelessFactory.createMouse();Mouse wiredMouse = wiredFactory.createMouse();wirelessMouse.make(); // 输出:制造无线鼠标wiredMouse.make();    // 输出:制造有线鼠标}
}

3. 抽象工厂模式

代码实现:

public interface Mouse {void make();
}public interface Keyboard {void make();
}public class WirelessMouse implements Mouse {@Overridepublic void make() {System.out.println("制造无线鼠标");}
}public class WiredMouse implements Mouse {@Overridepublic void make() {System.out.println("制造有线鼠标");}
}public class WirelessKeyboard implements Keyboard {@Overridepublic void make() {System.out.println("制造无线键盘");}
}public class WiredKeyboard implements Keyboard {@Overridepublic void make() {System.out.println("制造有线键盘");}
}public interface DeviceFactory {Mouse createMouse();Keyboard createKeyboard();
}public class WirelessDeviceFactory implements DeviceFactory {@Overridepublic Mouse createMouse() {return new WirelessMouse();}@Overridepublic Keyboard createKeyboard() {return new WirelessKeyboard();}
}public class WiredDeviceFactory implements DeviceFactory {@Overridepublic Mouse createMouse() {return new WiredMouse();}@Overridepublic Keyboard createKeyboard() {return new WiredKeyboard();}
}public class Demo {public static void main(String[] args) {DeviceFactory wirelessFactory = new WirelessDeviceFactory();DeviceFactory wiredFactory = new WiredDeviceFactory();Mouse wirelessMouse = wirelessFactory.createMouse();Keyboard wirelessKeyboard = wirelessFactory.createKeyboard();Mouse wiredMouse = wiredFactory.createMouse();Keyboard wiredKeyboard = wiredFactory.createKeyboard();wirelessMouse.make(); // 输出:制造无线鼠标wirelessKeyboard.make(); // 输出:制造无线键盘wiredMouse.make();    // 输出:制造有线鼠标wiredKeyboard.make();  // 输出:制造有线键盘}
}

四、总结

工厂模式的三种主要形式及其适用场景。每种模式都有其独特的优点和适用范围,合理选择和应用这些模式可以显著提升软件设计的质量和效率。

  1. 简单工厂模式:简单工厂模式以其简洁性和易于理解的特点,非常适合产品种类较少且相对稳定的场景。它通过一个统一的工厂类集中管理对象的创建逻辑,使得客户端代码更加简洁。然而,随着产品种类的增加,简单工厂类的条件判断逻辑可能会变得复杂,这可能会降低代码的可维护性。

  2. 工厂方法模式:工厂方法模式通过将对象的创建逻辑分散到多个具体的工厂类中,有效地解决了简单工厂模式在面对产品种类频繁变化时的扩展性问题。每个具体工厂类负责创建一种具体的产品,这使得系统在添加新产品时更加灵活,只需新增相应的工厂类而无需修改现有代码。这种模式特别适合产品种类较多且可能频繁变化的场景,它不仅提高了代码的可扩展性,还符合开闭原则,即对扩展开放,对修改关闭。

  3. 抽象工厂模式:抽象工厂模式在处理多个相关产品族的创建时表现出色。它通过一个抽象工厂接口定义了一组创建相关产品的方法,具体工厂实现这些方法来生产特定产品族中的产品。这种模式使得系统能够在不依赖具体产品实现的情况下,灵活地切换不同的产品族。这对于需要支持多种产品组合的系统来说是一个巨大的优势,它不仅提高了代码的可维护性,还增强了系统的灵活性和可扩展性。

        在实际的软件开发中,选择合适的工厂模式需要综合考虑系统的复杂性、产品的种类和变化频率以及系统的扩展需求。简单工厂模式适合小型项目或产品种类较少的场景;工厂方法模式适用于产品种类较多且可能频繁变化的系统;而抽象工厂模式则更适合需要创建多个相关产品族的复杂系统。

        此外,工厂模式的应用还体现了面向对象设计的核心原则,如封装、多态和依赖倒置等。通过将对象的创建逻辑封装在工厂类中,客户端代码可以依赖于抽象而非具体实现,这使得系统更加灵活,能够更好地应对需求的变化。

        总之,工厂模式作为一种经典的创建型设计模式,为对象的创建提供了一种优雅的解决方案。它不仅能够提高代码的可读性和可维护性,还能够增强系统的扩展性和灵活性。在未来的软件设计中,合理运用工厂模式将有助于我们构建出更加健壮、灵活和易于维护的软件系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Trae,字节跳动推出的 AI 编程助手插件

Trae 插件是 Trae 旗下全新一代的人工智能编程助手&#xff08;前身为 MarsCode 编程助手&#xff09;&#xff0c;以插件形式集成在本地开发环境中&#xff0c;具备极高的兼容性和灵活性&#xff0c;旨在提升开发效率和代码质量。它支持超过100种编程语言&#xff0c;兼容主流…

工作纪实_63-Mac电脑使用brew安装软件

最近在接触kafka&#xff0c;想着在自己的电脑安装一套环境&#xff0c;docker也能行&#xff0c;但是还是想装一些原生的软件试试看&#xff0c;因此便想着整理一下brew的命令&#xff0c;这命令确实是方便&#xff0c;不需要下载tar包乱八七糟的东西&#xff0c;一键安装 bre…

Python语法系列博客 · 第8期[特殊字符] Lambda函数与高阶函数:函数式编程初体验

上一期小练习解答&#xff08;第7期回顾&#xff09; ✅ 练习1&#xff1a;找出1~100中能被3或5整除的数 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]✅ 练习2&#xff1a;生成字符串长度字典 words ["apple", "banana", "grape…

Redis--主从复制

目录 一、配置 1.1 建立复制 1.2 断开复制 1.3 安全性 1.4 只读 1.5 传输延迟 二、拓扑 2.1 一主一从结构 2.2 一主多从结构 2.3 树形主从结构 在分布式系统中为了解决单点问题&#xff0c;通常会把数据复制多个副本部署到其他服务器&#xff0c;满足故障恢 复和负载均衡等需求…

已注册商标如何防止被不使用撤销!

近年来已注册商标被撤销越来越多&#xff0c;不乏著名企业或机构&#xff0c;普推知产商标老杨看到前一阵看到央视和百度等申请的商标也被申请撤销&#xff0c;连续三年不使用撤销也是正常的商标流程。 已注册商标被撤销普推老杨看到案例主要是集中在一些早期申请注册的好记的商…

解密大模型背后的秘密:训练、优化与挑战

解密大模型背后的秘密&#xff1a;训练、优化与挑战 在当今的人工智能领域&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已经成为了一个不可忽视的存在。从自然语言处理到图像生成&#xff0c;再到推荐系统&#xff0c;大模型以其强大的泛化能力和创…

App自动化测试流程方案与架构设计

App自动化测试流程方案与架构设计 一、核心流程设计 #mermaid-svg-kN4GmIvHb8MMT83M {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kN4GmIvHb8MMT83M .error-icon{fill:#552222;}#mermaid-svg-kN4GmIvHb8MMT83M .e…

字节跳动发布视频生成基础大模型 Seaweed-7B

近日&#xff0c;字节跳动发布了其全新视频生成基础大模型 Seaweed-7B&#xff0c;该模型由字节 Seed 团队开发&#xff0c;参数量仅为 70 亿&#xff0c;在多个方面展现出卓越性能&#xff0c;为 AI 视频生成领域带来了新的突破。 功能特点 支持多种生成方式&#xff1a;Sea…

如何基于区块链进行虚拟电厂运营平台建设?

本项目旨在基于区块链技术建设虚拟电厂运营平台&#xff0c;以提升省内大用户及工业企业和工业园区的需求响应能力&#xff0c;优化能源结构配置&#xff0c;并推动能源交易、需求响应和现货交易等新型业态的发展。通过建设虚拟电厂&#xff0c;项目将实现工业企业及园区各供用…

LeetCode[459]重复的子字符串(KMP解法)

思路&#xff1a; 最近迷上了KMP算法&#xff0c;所以这道题也是来搞一下KMP算法&#xff0c;总所周知KMP是需要维护一个前缀表&#xff0c;KMP算法不是比较一个字符串包不包含另一个字符串的吗&#xff0c;这个重复字符串的题也能用&#xff1f;猫爷&#xff1a;毋庸置疑&…

spring-batch批处理框架(2)

文章目录 八、作业控制8.1 作业启动8.1.1 SpringBoot 启动8.1.2 Spring 单元测试启动8.1.3 RESTful API 启动 8.2 作业停止方案1&#xff1a;Step 步骤监听器方式方案2&#xff1a;StepExecution停止标记 8.3 作业重启8.3.1 禁止重启8.3.2 限制重启次数8.3.3 无限重启 九、Item…

uniapp的通用页面及组件基本封装

1.基本布局页面 适用于自定义Navbar头部 <template><view :style"{ background : param.bgColor , height: 100% }"><block v-if"param.noHead"><slot name"head"></slot></block><block v-if"!p…

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告

基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;Matlab完整源码和数据&#xff09;&#xff0c;附模型研究报告 目录 基于MTF的1D-2D-CNN-GRU-Attention时序图像多模态融合的故障识别&#xff0c;适合研究学习&#xff08;…

HTTP/1.1 队头堵塞问题

文章目录 一、队头堵塞1、非管线化2、管线化 二、如何解决&#xff1f; 一、队头堵塞 1、非管线化 如图&#xff0c;http 请求必须等到上一个请求响应后才能发送&#xff0c;后面的以此类推&#xff0c;由此可以看出&#xff0c;在一个 tcp 通道中&#xff0c;如果某个 http 请…

施磊老师基于muduo网络库的集群聊天服务器(二)

文章目录 Cmake简单介绍Cmake与MakefileCmake配置CmakeLists.txt 编写完整cmake例子文件夹杂乱问题多级目录Cmakevscode 极其推荐 的 cmake方式 Mysql环境与编程mysql简单使用User表Friend表AllGroup表GroupUser表OfflineMessage表 集群聊天项目工程目录创建网络模块代码Chatse…

4.18---缓存相关问题(操作原子性,击穿,穿透,雪崩,redis优势)

为什么要用redis做一层缓存&#xff0c;相比直接查mysql有什么优势&#xff1f; 首先介绍Mysql自带缓存机制的问题&#xff1a; MySQL 的缓存机制存在一些限制和问题,它自身带的缓存功能Query Cache只能缓存完全相同的查询语句&#xff0c;对于稍有不同的查询语句&#xff0c…

健康养生指南

在快节奏的现代生活中&#xff0c;健康养生成为人们关注的焦点。它不仅关乎身体的强健&#xff0c;更是提升生活质量、预防疾病的关键。掌握科学的养生方法&#xff0c;能让我们在岁月流转中始终保持活力。 饮食是健康养生的基础。遵循 “均衡膳食” 原则&#xff0c;每日饮食需…

#去除知乎中“盐选”付费故事

添加油猴脚本&#xff0c;去除知乎中“盐选”付费故事 // UserScript // name 盐选内容隐藏脚本 // namespace http://tampermonkey.net/ // version 0.2 // description 自动隐藏含有“盐选专栏”或“盐选”文字的回答卡片 // author YourName // mat…

如何防止接口被刷

目录 &#x1f6e1;️ 一、常见的防刷策略分类 &#x1f527; 二、技术实现细节 ✅ 1. 基于 IP 限流 ✅ 2. 给接口加验证码 ✅ 3. 使用 Token 限制接口访问权限 ✅ 4. 给接口加冷却时间&#xff08;验证码类经典&#xff09; ✅ 5. 使用滑动窗口限流算法&#xff08;更精…

github 项目迁移到 gitee

1. 查看远程仓库地址 git remote -v 2. 修改远程仓库地址 确保 origin 指向你的 Gitee 仓库&#xff0c;如果不是&#xff0c;修改远程地址。 git remote set-url origin https://gitee.com/***/project.git 3. 查看本地分支 git branch 4. 推送所有本地分支 git p…