当前位置: 首页 > news >正文

【设计模式-简单工厂】

定义

简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于通过一个工厂类来创建某个产品类的实例,而不直接在客户端(调用方)中实例化对象

这种模式的主要思想是将对象的创建逻辑集中在一个地方,客户端只需要知道工厂提供的接口或方法,而无需关心具体产品类的实现细节。

组成

  • 工厂类(Factory):负责创建产品对象。工厂类包含一个方法,根据传入的参数来决定返回哪一个具体的产品类实例。
  • 产品类(Product):产品类是所有对象的父类或接口,定义了所有产品的公共接口或抽象类。
  • 具体产品类(ConcreteProduct):这些类是工厂类创建的实际对象,每个具体产品类实现了产品类定义的接口或继承了产品的抽象类。

简单工厂模式通常不是一个真正意义上的设计模式,而是一个编程技巧,因此它有时也被称为静态工厂方法模式。

代码

假设我们有一个场景,创建不同种类的汽车(Car)对象。通过简单工厂模式,我们可以定义一个工厂类,根据需要创建不同品牌的汽车对象。

// 产品接口(抽象产品类)
interface Car {void drive();
}// 具体产品类:宝马汽车
class BMW implements Car {@Overridepublic void drive() {System.out.println("Driving a BMW.");}
}// 具体产品类:奔驰汽车
class Benz implements Car {@Overridepublic void drive() {System.out.println("Driving a Benz.");}
}// 具体产品类:奥迪汽车
class Audi implements Car {@Overridepublic void drive() {System.out.println("Driving an Audi.");}
}// 简单工厂类
class CarFactory {public static Car createCar(String type) {switch (type) {case "BMW":return new BMW();case "Benz":return new Benz();case "Audi":return new Audi();default:throw new IllegalArgumentException("Unknown car type.");}}
}// 客户端代码
public class SimpleFactoryExample {public static void main(String[] args) {// 使用工厂类创建不同的汽车Car bmw = CarFactory.createCar("BMW");bmw.drive();Car benz = CarFactory.createCar("Benz");benz.drive();Car audi = CarFactory.createCar("Audi");audi.drive();}
}

代码说明:

  • Car 是产品接口,定义了所有汽车类需要实现的 drive() 方法。
  • BMW、Benz 和 Audi 是实现了 Car 接口的具体产品类。
  • CarFactory 是简单工厂类,它通过 createCar 方法根据传入的汽车类型(type)来返回具体的产品对象。
  • 在 SimpleFactoryExample 类中,客户端通过 CarFactory.createCar() 方法来创建不同类型的汽车对象,并调用它们的 drive() 方法。

优点

  • 集中管理对象创建:对象的创建逻辑集中在工厂类中,减少了客户端的复杂性。客户端只需要知道如何调用工厂方法,而不需要知道具体的产品类如何创建。
  • 减少代码重复:如果有多个地方需要创建相似的对象,工厂方法可以减少代码重复,确保对象创建的一致性。
  • 遵循单一职责原则:工厂类专注于对象的创建,客户端专注于业务逻辑,职责分离,代码更清晰。

缺点

  • 不易扩展:如果需要添加新的产品类(比如新增一种汽车类型),就需要修改工厂类的代码,这违反了开闭原则(Open-Closed Principle)。开闭原则要求对扩展开放,对修改关闭。
  • 产品类别有限制:简单工厂适合产品种类较少的场景。如果产品种类太多,工厂类可能会变得臃肿,包含大量 switch-case 或 if-else 语句,导致代码可读性和维护性降低。
  • 职责过重:随着产品种类的增加,工厂类可能承担过多职责,成为系统中的“上帝类”,这违背了设计中的单一职责原则。

场景

  • 产品种类较少:当需要创建的对象种类较少时,简单工厂模式是一个不错的选择,因为它的实现简单直观。
  • 客户端不关心产品的创建过程:如果客户端不关心对象如何被创建,只关心如何使用对象,那么可以使用简单工厂模式将对象的创建逻辑封装在工厂类中。
  • 需要避免代码重复:在系统的多个地方需要创建相似的对象时,工厂方法可以帮助减少代码重复,维护一致性。

简单工厂 vs 工厂方法模式 vs 抽象工厂模式

  • 简单工厂模式:所有的对象创建都在一个工厂类中实现,通过传入参数来决定创建哪种产品类。这种模式适合简单的场景。
  • 工厂方法模式:通过定义一个工厂接口,并为每个产品类提供一个具体的工厂类来创建对应的产品。工厂方法模式符合开闭原则,增加新的产品时无需修改已有工厂类,只需新增对应的工厂类即可。
  • 抽象工厂模式:用于创建一系列相关的对象。抽象工厂模式为创建一组相关或相互依赖的对象提供了一个接口,而无需指定它们的具体类。

总结

简单工厂模式是实现对象创建的一种常见方式,能够将产品对象的创建集中到一个工厂类中,减少客户端的复杂性。虽然它易于理解和实现,但在产品种类较多时不容易扩展,因此适合用于简单场景。对于更复杂的场景,可能需要工厂方法模式或抽象工厂模式来增强灵活性和扩展性。

相关文章:

【设计模式-简单工厂】

定义 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,用于通过一个工厂类来创建某个产品类的实例,而不直接在客户端(调用方)中实例化对象。 这种模式的主要思想是将对象的创建逻辑集中在一个…...

多个版本的GCC(GNU编译器集合)可以同时安装并存

在Ubuntu系统中,多个版本的GCC(GNU编译器集合)可以同时安装并存。GCC是编译C、C以及其他编程语言程序的重要工具,不同的项目可能需要不同版本的GCC来确保兼容性。 为什么需要多个GCC版本 项目依赖:不同的软件项目可能…...

量子纠错--shor‘s 码

定理1 (量子纠错的条件) C是一组量子编码,P是映射到C上的投影算子。假设是一个算子元素描述的量子操作,那么基于量子编码C,存在一个能对抗描述的噪声的纠错操作R的充要条件是 对某个复元素厄米矩阵成立。 将算子元素称为导致的错误。如果这样…...

机器学习2

一、模型评估方法 1.1 K折交叉验证法(K-Fold Cross Validation) 1.1.1 定义 K折交叉验证法是一种用于评估模型性能的技术。它将数据集分为K个相等的子集,模型会轮流使用一个子集作为测试集,其余K-1个子集作为训练集。这个过程会…...

二分查找_ x 的平方根搜索插入位置山脉数组的峰顶索引

x 的平方根 在0~X中肯定有数的平方大于X&#xff0c;这是肯定的。我们需要从中找出一个数的平方最接近X且不大于X。0~X递增&#xff0c;它们的平方也是递增的&#xff0c;这样我们就可以用二分查找。 我们找出的数的平方是<或者恰好X&#xff0c;所以把0~X的平方分为<X …...

汽车建模用什么软件最好?汽车建模渲染建议!

在汽车建模和渲染领域&#xff0c;选择合适的软件对于实现精确的设计与高质量的视觉效果至关重要。那么不少的汽车设计师如何选择合适的建模软件与渲染方案呢&#xff0c;一起来简单看看吧&#xff01; 一、汽车建模用软件推荐 1、Alias Autodesk旗下的Alias系列软件是汽车设…...

蘑菇分类识别数据集(猫脸码客 第222期)

蘑菇分类识别文本/图像数据集 蘑菇&#xff0c;作为一种广泛分布于全球的真菌&#xff0c;隶属于伞菌目伞菌亚门蘑菇科蘑菇属&#xff0c;拥有众多别名&#xff0c;如白蘑菇、洋蘑菇等。其不仅是世界上人工栽培最广泛、产量最高、消费量最大的食用菌品种之一&#xff0c;还在许…...

长短期记忆网络(Long Short-Term Memory,LSTM)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 长短期记忆网络&#xff08;Long Short-Term Memory&#xff0c;简称LSTM&#xff09;是一种特殊的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;简称RNN&#xff09;架构&#…...

WHAT - 引入第三方组件或项目使用需要注意什么

目录 1. 功能匹配2. 社区与维护3. 兼容性4. 性能5. 易用性6. 安全性7. 授权和许可证8. 国际化支持9. 依赖性10. 未来维护 在前端开发过程中引入第三方组件或项目时&#xff0c;应该从以下几个方面进行考虑&#xff0c;以确保引入的组件能够有效解决问题并适合长期维护&#xff…...

原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布

华为于10月22日19:00举办“原生鸿蒙之夜暨华为全场景新品发布会”。此次发布会推出全新的原生鸿蒙操作系统HarmonyOS NEXT&#xff08;HarmonyOS 5&#xff09;以及nova 13、WATCH Ultimate、MatePad Pro等新品。 据介绍&#xff0c;此前已经发布过的鸿蒙系统&#xff0c;由于系…...

WindTerm配置快捷键Ctrl+C和Ctrl+V

WindTerm配置快捷键CtrlC和CtrlV 平时使用ssh和sftp连接的时候&#xff0c;经常使用windterm&#xff0c; 但是windterm里面找不到相关的快捷键设置&#xff0c; 因为操作习惯&#xff0c;想把CtrlC和CtrlV分别配置为复制和粘贴&#xff0c;其他的快捷键操作可以按照该方法进…...

AOP学习

corol调用serverce不在是直接调用的是调用底层代理对象&#xff0c;由代理对象统一帮我们处理 AOP常见概念 通知类型 切面顺序...

【ubuntu18.04】ubuntu18.04升级cmake-3.29.8及还原系统自带cmake操作说明

参考链接 cmake升级、更新&#xff08;ubuntu18.04&#xff09;-CSDN博客 升级cmake操作说明 下载链接 Download CMake 下载版本 下载软件包 cmake-3.30.3-linux-x86_64.tar.gz 拷贝软件包到虚拟机 cp /var/run/vmblock-fuse/blockdir/jrY8KS/cmake-3.29.8-linux-x86_64…...

利用Docker搭建一套Mycat2+MySQL8一主一从、读写分离的最简单集群(保姆教程)

文章目录 1、Mycat介绍1.1、mycat简介1.2、mycat重要概念1.3、Mycat1.x与Mycat2功能对比1.2、主从复制原理 2、前提准备3、集群规划4、安装和配置mysql主从复制4.1、master节点安装mysql8容器4.2、slave节点安装mysql8容器4.2、配置主从复制4.3、测试主从复制配置 5、安装mycat…...

算法——python实现堆排序

文章目录 堆排序二叉树堆堆排序的过程&#xff1a;代码实现python中的heapq模块 堆排序 二叉树 关于二叉树的操作&#xff0c;其实核心就是 父节点找子节点&#xff0c;子节点找父节点 如果要将二叉树存储到队列中&#xff0c;就需要找出 父子节点之间的规律&#xff1a; 父…...

uniapp-components(封装组件)

<myitem></myitem> 在其他类里面这样调用。...

avue-crud组件,输入框回车搜索问题

crud组件&#xff0c;输入框回车搜索问题。 文档是并没有标注&#xff0c;实际上已经具备此功能。 需要在curd的option增加属性 searchEnter: true 即可实现输入内容后回车搜索。 avue的一些踩坑记录 - 前端小小菜 - 博客园...

STM32F407ZGT6定时器相关测试

结论&#xff1a; 20us以下的IO翻转操作&#xff0c;存在误差输出比较定时器使能与禁用功能正常输入捕获定时器使能与禁用功能正常单通道输出比较、输入捕获均正常多通道输出比较波形无干扰&#xff0c;但仍是存在20us以下的IO翻转操作存在误差多通道输入捕获正常 一、单一通…...

群晖通过 Docker 安装 GitLab

Docker 配置容器步骤都是大同小异的&#xff0c;可以参考&#xff1a; 群晖通过 Docker 安装 Gitea-CSDN博客 1. 在 Docker 文件夹中创建 GitLab&#xff0c;并创建子文件夹 2. 设置权限 3. 打开 Docker 应用&#xff0c;并在注册表搜索 gitlab-ce 4. 选择 gitlab-ce 映像运行…...

1.Node.js环境搭建(windows)

一、环境搭建(windows) 1.1下载并安装 https://nodejs.org/dist/v18.20.4/node-v18.20.4-x64.msi1.2测试和查看版本 #cmd命令 node -v输出&#xff1a; #能正确输出版本号&#xff0c;说明安装成功 v18.20.41.3使用nodejs启动第一个js #hello.js console.log(hello world!…...

Suricata在CentOS7上的性能优化:如何配置网卡混杂模式与端口聚合

Suricata在CentOS7上的性能优化&#xff1a;网卡混杂模式与端口聚合实战指南 当企业网络流量突破千兆级别时&#xff0c;传统单网卡监控方案往往力不从心。我曾为某金融客户部署Suricata时&#xff0c;单台服务器每天要处理超过2TB的流量数据&#xff0c;正是通过下文介绍的网卡…...

vue3-count-to避坑指南:数字增长动画的7个常见问题与解决方案

Vue3-Count-To深度避坑实战&#xff1a;数字动画7大疑难解析 数字动态增长效果在数据可视化、金融仪表盘和运营数据展示中扮演着关键角色。vue3-count-to作为Vue3生态中专精于此的轻量级库&#xff0c;虽然API简洁&#xff0c;但在真实业务场景中往往会遇到各种边界情况。本文将…...

OpenClaw+GLM-4.7-Flash:24小时运行的智能监控助手

OpenClawGLM-4.7-Flash&#xff1a;24小时运行的智能监控助手 1. 为什么需要智能监控助手&#xff1f; 去年我负责维护一个内部文档站点时&#xff0c;经常遇到半夜服务崩溃却无人知晓的情况。直到第二天同事反馈"页面打不开"&#xff0c;我才手忙脚乱地查日志、重…...

提升效率:用快马一键生成网络应用用户认证api模块

最近在开发一个网络应用时&#xff0c;遇到了用户认证模块的重复开发问题。每次新建项目都要从头写注册登录逻辑&#xff0c;不仅耗时还容易出错。后来发现了InsCode(快马)平台的智能生成功能&#xff0c;帮我快速解决了这个问题。 用户认证模块的核心需求 网络应用中&#xff…...

从CISCN2019华北赛区Web1看SQL注入的巧妙绕过技巧

1. 从CISCN2019华北赛区Web1看SQL注入的巧妙绕过技巧 在CTF比赛中&#xff0c;Web安全题目常常会设置各种过滤规则来阻止常见的攻击手法。CISCN2019华北赛区的Web1题目"Hack World"就是一个典型的例子&#xff0c;它通过组合过滤的方式限制了传统SQL注入手段。这道题…...

从C语言到裸机运行:i.MX6ULL 的 GPIO 控制与编译链接过程分析

引言在嵌入式系统开发中&#xff0c;从高级语言到硬件控制的完整链路涉及编译、链接、寄存器配置等多个环节。本文基于 i.MX6ULL 平台&#xff0c;以 C 语言实现 LED 与蜂鸣器控制为例&#xff0c;系统分析 ARM 裸机开发中的编译工具链使用、链接脚本的作用&#xff0c;以及 GP…...

ChromePass终极指南:浏览器密码提取与安全管理完全攻略

ChromePass终极指南&#xff1a;浏览器密码提取与安全管理完全攻略 【免费下载链接】chromepass Get all passwords stored by Chrome on WINDOWS. 项目地址: https://gitcode.com/gh_mirrors/chr/chromepass 副标题&#xff1a;从密码危机到数据掌控&#xff1a;3步实现…...

s2-pro快速上手指南:3步完成文本转语音与音色迁移实操手册

s2-pro快速上手指南&#xff1a;3步完成文本转语音与音色迁移实操手册 1. 平台简介 s2-pro是Fish Audio开源的专业级语音合成模型镜像&#xff0c;它能够将文本内容转换为自然流畅的语音&#xff0c;并支持通过参考音频实现音色迁移功能。这意味着你可以上传一段参考音频&…...

Solidity 智能合约入门:从 0 到 1 编写第一个区块链合约

一、什么是 Solidity&#xff1f; Solidity 是一门面向以太坊虚拟机&#xff08;EVM&#xff09;、静态类型的高级编程语言&#xff0c;专门用于编写区块链上的智能合约。 简单来说&#xff1a; 智能合约 运行在区块链上的自动执行代码&#xff08;无需第三方&#xff0c;代…...

解锁自定义键盘体验:用Vial-QMK打造个性化配置指南

解锁自定义键盘体验&#xff1a;用Vial-QMK打造个性化配置指南 【免费下载链接】vial-qmk QMK fork with Vial-specific features. 项目地址: https://gitcode.com/gh_mirrors/vi/vial-qmk 核心价值&#xff1a;为什么选择Vial-QMK定制键盘&#xff1f; 在机械键盘的世…...