简单工厂模式(Simple Factory Pattern)​​ 详解

 ✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页: Meteors.的博客
💞当前专栏: 设计模式
✨特色专栏: 知识分享
🥭本文内容: 简单工厂模式(Simple Factory Pattern)​​ 详解
📚 ** ps **  : 阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。


目录

一. 介绍

二. 组成

三. 简单demo

四. 特点

1. 优点

2. 缺点:

五. 使用场景

六. 总结


一. 介绍

​​简单工厂模式(Simple Factory Pattern)​​ ​​不是 23 种设计模式之一​​。简单工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需指定它们的具体类。它属于创建型模式,通过一个工厂类来创建不同类型的对象。


二. 组成

工厂类(Factory):负责创建具体产品的实例,客户端通过工厂类的静态方法来创建对象。
抽象产品(Product):定义产品的接口,是工厂类所创建对象的基类。
具体产品(Concrete Product):实现或继承抽象产品的具体类。


三. 简单demo

使用简单工厂模式创建不同类型的汽车:

// 抽象产品 - 汽车接口
public abstract class Car {public abstract void drive();
}// 具体产品 - 奥迪汽车
public class Audi extends Car {@Overridepublic void drive() {System.out.println("Driving Audi");}
}// 具体产品 - 宝马汽车
public class BMW extends Bruce {@Overridepublic void drive() {System.out.println("Driving BMW");}
}// 具体产品 - 奔驰汽车
public class Benz extends Car {@Overridepublic void drive() {System.out.println("Driving Benz");}
}// 简单工厂类
public class CarFactory {public static Car createCar(String type) {if ("audi".equals(type)) {return new Audi();} else if ("bmw".equals(type)) {return new BMW();} else if ("benz".equals(type)) {return new Benz();} else {throw new IllegalArgumentException("Unknown car type: " + type);}}
}// 客户端代码
public class Client {public static void main(String[] args) {Car audi = CarFactory.createCar("audi");audi.drive();Car bmw = CarFactory.createCar("bmw");bmw.drive();Car benz = CarFactory.createCar("benz");benz.drive();}
}

四. 特点

1. 优点

  • 客户端不需要知道具体产品的类名,只需要知道产品标识即可

  • 隐藏了对象创建的细节,降低了客户端与具体产品类的耦合度

  • 当产品种类增加时,不需要修改客户端代码,只需修改工厂类

2. 缺点:

  • 工厂类集中了所有产品的创建逻辑,一旦出现问题,整个系统都会受影响

  • 增加新产品时需要修改工厂类,违背了开闭原则


五. 使用场景

  1. 工厂类负责创建的对象比较少
  2. 客户端只知道传入工厂类的参数,对于如何创建对象不关心

六. 总结

简单工厂模式是工厂模式中最简单的一种,它通过一个工厂类来封装对象的创建过程。虽然这种模式违反了开闭原则,但在产品种类相对固定的情况下,它是一个非常实用的设计模式。在实际开发中,可以根据具体需求选择是否使用简单工厂模式。


最后,

        其它设计模式会陆续更新,希望文章对你有所帮助!

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

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

相关文章

新电脑硬盘如何分区?3个必知技巧避免“空间浪费症”!

刚到手的新电脑,硬盘就像一间空荡荡的大仓库,文件扔进去没多久就乱成一锅粥?别急,本文会告诉你新电脑硬盘如何分区,这些方法不仅可以帮你给硬盘分区,还可以调整/合并分区大小等。所以,本文的分区…

【微知】git submodule的一些用法总结(不断更新)

文章目录综述要点细节如何新增一个submodule?如何手动.gitmodules修改首次增加一个submodule?git submodule init,init子命令依据.gitmodules.gitmodules如何命令修改某个成员以及同步?如果submodule需要修改分支怎么办&#xff1…

【Spring Cloud微服务】9.一站式掌握 Seata:架构设计与 AT、TCC、Saga、XA 模式选型指南

文章目录一、Seata 框架概述二、核心功能特性三、整体架构与三大角色1. Transaction Coordinator (TC) - 事务协调器(Seata Server)2. Transaction Manager (TM) - 事务管理器(集成在客户端)3. Resource Manager (RM) - 资源管理器…

AI赋能!Playwright带飞UI自动化脚本维护

80%的自动化脚本因一次改版报废? 开发随意改动ID导致脚本集体崩溃?背景UI自动化在敏捷开发席卷行业的今天,UI自动化测试深陷一个尴尬困局:需求迭代速度(平均2周1次)> 脚本维护速度(平…

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南

Redis、Zookeeper 与关系型数据库分布式锁方案对比及性能优化实战指南 1. 问题背景介绍 在分布式系统中,多节点并发访问共享资源时,如果不加锁或加锁不当,会导致数据不一致、超卖超买、竞态条件等问题。常见的分布式锁方案包括基于Redis、Zoo…

网络安全A模块专项练习任务十一解析

任务十一:IP安全协议配置任务环境说明: (Windows 2008)系统:用户名Administrator,密码Pssw0rd1.指定触发SYN洪水攻击保护所必须超过的TCP连接请求数阈值为5;使用组合键winR,输入regedit打开注册表编辑器&am…

金蝶中间件适配HGDB

文章目录环境文档用途详细信息环境 系统平台:Microsoft Windows (64-bit) 10 版本:5.6.5 文档用途 本文章主要介绍金蝶中间件简单适配HGDB。 详细信息 一、金蝶中间件Apusic安装与配置 1.Apusic安装与配置 Windows和Linux下安装部署过程相同。 &…

使用a标签跳转之后,会刷新一次,这个a标签添加的样式就会消失

<ul class"header-link"><li><a href"storeActive.html">到店活动</a></li><li><a href"fuwu.html">服务</a></li><li><a href"store.html">门店</a></l…

线程池实现及参数详解

线程池概述 Java线程池是一种池化技术&#xff0c;用于管理和复用线程&#xff0c;减少线程创建和销毁的开销&#xff0c;提高系统性能。Java通过java.util.concurrent包提供了强大的线程池支持。 线程池参数详解 1. 核心参数 // 创建线程池的完整构造函数 ThreadPoolExecu…

K8S 部署 NFS Dynamic Provisioning(动态存储供应)

K8S 部署 NFS Dynamic Provisioning&#xff08;动态存储供应&#xff09; 本文档提供完整的 K8s NFS 动态存储部署流程&#xff0c;包含命名空间创建、RBAC 权限配置、Provisioner 部署、StorageClass 创建及验证步骤。 2. 部署步骤 2.1 创建命名空间 首先创建独立的命名空间 …

JavaEE 进阶第二期:开启前端入门之旅(二)

专栏&#xff1a;JavaEE 进阶跃迁营 个人主页&#xff1a;手握风云 目录 一、VS Code开发工具的搭建 1.1. 创建.html文件 1.2. 安装插件 1.3. 快速生成代码 二、HTML常见标签 2.1. 换行标签 2.2. 图片标签: img 2.3. 超链接 三、表格标签 四、表单标签 4.1. input标…

【RNN-LSTM-GRU】第二篇 序列模型原理深度剖析:从RNN到LSTM与GRU

本文将深入探讨循环神经网络&#xff08;RNN&#xff09;的核心原理、其面临的长期依赖问题&#xff0c;以及两大革命性解决方案——LSTM和GRU的门控机制&#xff0c;并通过实例和代码帮助读者彻底理解其工作细节。1. 引言&#xff1a;时序建模的数学本质在上一篇概述中&#x…

Qt---状态机框架QState

QState是Qt状态机框架&#xff08;Qt State Machine Framework&#xff09;的核心类&#xff0c;用于建模离散状态以及状态间的转换逻辑&#xff0c;广泛应用于UI交互流程、设备状态管理、工作流控制等场景。它基于UML状态图规范设计&#xff0c;支持层次化状态、并行状态、历史…

GitHub 热榜项目 - 日榜(2025-09-02)

GitHub 热榜项目 - 日榜(2025-09-02) 生成于&#xff1a;2025-09-02 统计摘要 共发现热门项目&#xff1a;14 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现AI Agent生态爆发趋势&#xff0c;Koog、Activepieces等项目推动多平台智能体开发框架成熟。语…

华为卫星对星引导技术深度解析:原理、实现与开源替代方案

利号&#xff1a;CNXXXXXX 涉及多传感器融合/自适应波束成形/轨道预测算法一、技术原理剖析&#xff1a;卫星间高精度指向的核心挑战在低轨卫星&#xff08;LEO&#xff09;星座中&#xff0c;卫星间链路&#xff08;ISL&#xff09;的建立面临三大技术难题&#xff1a;1. 动力…

水下管道巡检机器人结构设cad+三维图+设计说明书

目 录 1 绪论 1 1.1 选题的背景及意义 1 1.2 水下管道巡检机器人的分类 2 1.2.1 管道巡检技术的分类 2 1.2.2管道巡检机器人的分类 2 1.3 研究的现状 3 1.3.1 国内的研究现状 3 1.3.2 国外的研究现状 4 1.4 水下管道巡检机器人的发展趋势 5 1.…

[从零开始面试算法] (11/100) LeetCode 226. 反转二叉树:递归的“镜像”魔法

引言 欢迎来到本系列的第十一篇&#xff01;在我们通过“最大深度”问题初步领略了树的递归之美后&#xff0c;今天我们将面对一个更能体现递归“分治”思想的经典问题——LeetCode 226. 反转二叉树。 这道题在面试界的地位非同凡响&#xff0c;它因 Homebrew 的作者 Max How…

Java设计模式之创建型—建造者模式

Java中最常用的设计模式-CSDN博客 “把对象的构造步骤拆成链式方法&#xff0c;调用者按需填参&#xff0c;最后一次性 build&#xff0c;避免构造函数爆炸。” 经典场景 参数多&#xff08;>4 个&#xff09;且大部分可选 需要不可变对象&#xff08;final 字段&#xf…

网页计时器,支持多计时器管理、数据分享、用户数据同步、全屏展示等功能,可进行倒计时、正计时和显示世界时钟。

一个具有现代化 UI 和交互的计时器网页应用&#xff0c;支持多计时器管理、数据分享、用户数据同步、全屏展示等功能&#xff0c;可进行倒计时、正计时和显示世界时钟。它采用玻璃态设计和流畅动画效果&#xff0c;提供极佳的视觉体验。 特点&#xff1a; 支持多个计时器的创建…

纹理融合——用 TypeScript + Babylon.js 打造“可混合纹理序列”

我不想搞个一新的Shader&#xff0c;我就想用已有的材质&#xff08;比如StandardMaterial和PBRMetallicRoughnessMaterial&#xff09;实现纹理融合渐变等效果&#xff0c;于是我搞了一个TextureBlender。一、为什么重复造轮子&#xff1f;GPU 插值受限material.diffuseTextur…