【简单理解什么是简单工厂、工厂方法与抽象工厂模式】
一、简单工厂模式
1.简单工厂模式 通过一个工厂类集中管理对象的创建 ,通过参数决定具体创建哪个对象。
#适合对象类型较少且变化不频繁的场景,缺点是违反开闭原则(新增产品需修改工厂类)
开闭原则(对扩展开放+对修改关闭) :当有新的需求或变化时,可以通过增加新的模块或功能来扩展软件实体的行为,而不需要修改现有的代码。;软件实体一旦被创建并投入使用,其内部实现应该保持稳定,不应轻易修改。
- 实现步骤:
定义产品接口——>实现具体产品类——>创建工厂类——>通过参数控制对象创建
示例代码:
// 1. 定义产品接口
interface Car {void drive();
}// 2. 具体产品实现
class Tesla implements Car {@Overridepublic void drive() {System.out.println("Driving Tesla!");}
}class BMW implements Car {@Overridepublic void drive() {System.out.println("Driving BMW!");}
}// 3. 使用枚举优化参数
enum CarType {TESLA, BMW
}class CarFactory {public static Car createCar(CarType type) {switch (type) {case TESLA:return new Tesla();case BMW:return new BMW();default:throw new IllegalArgumentException("Unknown car type!");}}
}// 4. 使用
public class Main {public static void main(String[] args) {Car tesla = CarFactory.createCar(CarType.TESLA);tesla.drive(); // Driving Tesla!Car bmw = CarFactory.createCar(CarType.BMW);bmw.drive(); // Driving BMW!}
}
二、工厂方法模式
- 工厂方法模式通过定义一个抽象工厂接口,由子类(具体工厂)决定创建哪个具体产品。符合开闭原则,新增产品只需新增工厂类,无需修改原有代码。
- 扩展性强,新增产品类型时只需添加新工厂和产品类。解耦客户端与具体产品,客户端只需依赖抽象工厂接口。
- 工厂方法模式的实现步骤:定义产品接口——>定义产品的具体实现类,让其实现"产品接口"并重写"产品接口方法"——>定义产品的工厂接口——>定义产品具体的工厂类,让其实"现工厂接口"并重写"工厂接口方法"——>在使用的时候需要创建不同产品的工厂类对象,然后调用他们重写后的接口方法来创建对象。
示例代码
// 1. 定义产品接口
interface Phone {void call();
}// 2. 具体产品实现
class iPhone implements Phone {@Overridepublic void call() {System.out.println("Calling with iPhone!");}
}class Samsung implements Phone {@Overridepublic void call() {System.out.println("Calling with Samsung!");}
}// 3. 定义工厂接口
interface PhoneFactory {Phone createPhone();
}// 4. 具体工厂实现
class iPhoneFactory implements PhoneFactory {@Overridepublic Phone createPhone() {return new iPhone();}
}class SamsungFactory implements PhoneFactory {@Overridepublic Phone createPhone() {return new Samsung();}
}// 5. 使用
public class Main {public static void main(String[] args) {PhoneFactory iphoneFactory = new iPhoneFactory();Phone iphone = iphoneFactory.createPhone();iphone.call(); // Calling with iPhone!PhoneFactory samsungFactory = new SamsungFactory();Phone samsung = samsungFactory.createPhone();samsung.call(); // Calling with Samsung!}
}
三、抽象工厂模式
-
抽象工厂模式用于创建一组相关或依赖的对象(如不同品牌的手机 + 耳机)。适用于产品族的创建,而不是单个产品。
-
定义与特点
定义:抽象工厂模式用于创建一组相关或依赖的对象(如不同品牌的手机 + 耳机)。
适用场景:需要创建“产品族”的场景(如苹果全家桶、三星全家桶)。
核心思想:抽象工厂接口定义多个工厂方法,每个方法对应一个产品类型。 -
实现步骤
定义产品族接口(如Phone和Earphones)——>实现具体产品类(分属不同产品族)——>定义抽象工厂接口,包含多个工厂方法——> 实现具体工厂类,为每个产品族提供创建逻辑
示例代码:
// 1. 定义产品族接口
interface Phone {void call();
}interface Earphones {void listen();
}// 2. 具体产品实现(苹果产品族)
class iPhone implements Phone {@Overridepublic void call() {System.out.println("Calling with iPhone!");}
}class AirPods implements Earphones {@Overridepublic void listen() {System.out.println("Listening with AirPods!");}
}// 3. 具体产品实现(三星产品族)
class SamsungPhone implements Phone {@Overridepublic void call() {System.out.println("Calling with Samsung!");}
}class SamsungEarphones implements Earphones {@Overridepublic void listen() {System.out.println("Listening with Samsung Earphones!");}
}// 4. 定义抽象工厂接口
interface TechFactory {Phone createPhone();Earphones createEarphones();
}// 5. 具体工厂实现(苹果工厂)
class AppleFactory implements TechFactory {@Overridepublic Phone createPhone() {return new iPhone();}@Overridepublic Earphones createEarphones() {return new AirPods();}
}// 6. 具体工厂实现(三星工厂)
class SamsungFactory implements TechFactory {@Overridepublic Phone createPhone() {return new SamsungPhone();}@Overridepublic Earphones createEarphones() {return new SamsungEarphones();}
}// 7. 使用
public class Main {public static void main(String[] args) {TechFactory appleFactory = new AppleFactory();appleFactory.createPhone().call(); // Calling with iPhone!appleFactory.createEarphones().listen(); // Listening with AirPods!TechFactory samsungFactory = new SamsungFactory();samsungFactory.createPhone().call(); // Calling with Samsung!samsungFactory.createEarphones().listen(); // Listening with Samsung Earphones!}
}
四、模式对比与疑问解答
- 工厂方法模式中选择接口而非抽象类的原因
答案:
灵活性更高:接口支持多实现,Java 不支持多继承,但类可实现多个接口。抽象类可能包含默认实现,限制子类灵活性。
符合开闭原则:新增产品(如 Xiaomi)只需添加新具体产品类和对应工厂类,无需修改原有代码。
设计意图契合:工厂方法模式的核心是定义“创建对象的接口”,而接口仅定义方法签名,不提供具体实现。 - 三种模式的核心区别
特性 | 简单工厂模式 | 工厂方法模式 | 抽象工厂模式 |
---|---|---|---|
创建对象类型 | 单一产品的不同实现(不同汽车) | 单一产品的不同实现(不同手机) | 一组相关产品(手机 + 耳机) |
工厂结构 | 单一工厂类(静态方法) | 抽象工厂接口 + 具体工厂类 | 抽象工厂接口 + 具体工厂类 |
工厂方法数量 | 1 个(createCar) | 1 个(createPhone) | 多个(如 createPhone 和 createEarphones) |
扩展性 | 新增产品需修改工厂类 | 新增产品只需添加新工厂类 | 新增产品族需添加新工厂类 |
是否符合开闭原则 | 不符合 | 符合 | 符合 |
相关文章:
【简单理解什么是简单工厂、工厂方法与抽象工厂模式】
一、简单工厂模式 1.简单工厂模式 通过一个工厂类集中管理对象的创建 ,通过参数决定具体创建哪个对象。 #适合对象类型较少且变化不频繁的场景,缺点是违反开闭原则(新增产品需修改工厂类) 开闭原则(对扩展开放对修改关闭) :当…...
C++之nullptr
文章目录 前言 一、NULL 1、代码 2、结果 二、nullptr 1、代码 2、结果 总结 前言 当我们谈论空指针时,很难避免谈及nullptr。nullptr是C++11引入的一个关键字,用来表示空指针。在C++中,空指针一直是一个容易引起混淆的问题,因为在早期版本的C++中,通常使用NULL来…...
Java List<JSONObject> 中的数据转换为 List<T>
从方法的功能推测,T 应该是一个具体的 Java Bean 类型,用于将 List<JSONObject> 中的数据转换为 List<T>。以下为你详细介绍如何传递泛型 T 以及如何实现该方法。 import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; im…...
下【STL 之速通pair vector list stack queue set map 】
上一篇 【STL 之速通pair vector list stack queue set map 】 queue note priority_queue pq; 使用的还是很方便的 #include <iostream> #include <queue>using namespace std;int main() {// Queue 示例queue<int> q;q.push(10);q.push(20);q.push(30);…...
安装大数据分析利器Spark
大数据分析利器Spark:部署模式与实践全解析 在大数据领域,Spark是一个热门的开源框架,今天就带大家深入了解Spark及其常见部署模式。Spark是基于内存的快速、通用、可扩展的大数据分析计算引擎,诞生于伯克利大学。与Hadoop相比&a…...
遨游科普:三防平板是指哪三防?有哪些应用场景?
在工业4.0与数字化转型的浪潮中,平板电脑早已突破消费娱乐的边界,成为工业生产流程中不可或缺的智能终端。但是,传统消费级平板在复杂工业环境中的“脆弱性”——屏幕易碎、接口易进尘、机身惧水等问题——严重制约了其在专业领域的深度应用。…...
9. RabbitMQ 消息队列幂等性,优先级队列,惰性队列的详细说明
9. RabbitMQ 消息队列幂等性,优先级队列,惰性队列的详细说明 文章目录 9. RabbitMQ 消息队列幂等性,优先级队列,惰性队列的详细说明1. RabbitMQ 消息队列的 “ 幂等性 ” 的问题1.1 RabbitMQ 消息队列的“幂等性”的概念 2. Rabbi…...
k8s创建一个pod,查看状态和详细信息,进入pod,以及删除这个pod
在 Kubernetes(K8s)中,可以使用 kubectl 命令行工具来完成创建 Pod、查看状态和详细信息、进入 Pod 以及删除 Pod 的操作。以下是具体步骤: 创建一个 Pod: 假设你有一个简单的 nginx Pod 的 YAML 配置文件 nginx…...
从盲目清运到精准调度:一个AI芯片引发的智慧环卫升级
在深圳某科技园区的清晨,环卫工人老张发现一个奇怪现象:往常需要逐个检查的50个智能垃圾桶,今天系统自动标注了7个待清运点位。这背后是搭载全志T113-i处理器的智能垃圾桶系统在发挥作用,通过AI视觉识别将垃圾满溢检测准确率提升至…...
MQTT协议:IoT通信的轻量级选手
文章总结(帮你们节约时间) MQTT协议是一种轻量级的发布/订阅通信协议。MQTT通信包括连接建立、订阅、发布和断开等过程。MQTT基于TCP/IP,其通信过程涉及多种控制包和数据包。ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。 想象一…...
Docker 入门指南:基础知识解析
1. 引言 1.1 为什么学习 Docker 1.1.1 Docker 的优势 环境一致:在不同环境中(开发、测试、生产)保持一致的运行环境。快速部署:容器启动速度快,适合微服务架构。资源隔离:容器之间相互隔离,避…...
【安当产品应用案例100集】043-安当物联网数据安全传输方案
一、需求背景 物联网(IoT)技术在当前世界各行业中的应用越来越广泛,数据安全和安全数据传输、鉴权成为了物联网解决方案不可或缺的一部分。如何通过有效的安全措施来保护物联网设备的数据传输和鉴权,确保数据在设备和服务器之间或…...
C#/.NET/.NET Core技术前沿周刊 | 第 33 期(2025年4.1-4.6)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
Django视图详解
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 一、Django视图是什么? 视图(View) 是Django处理HTTP请求的核心组件。它接收一个HttpRequest对象,处理业务逻辑,并返回一个HttpResponse对象(…...
【区块链+ 人才服务】北京师范大学区块链底层链平台 | FISCO BCOS 应用案例
北京师范大学是教育部直属重点大学,2018 年 6 月,北京师范大学成立知识区块链研究中心,致力于区块链基础技术及其在教育领域的应用研究。 2020 年6 月18 日, 北京市人民政府办公厅发布《北京市区块链创新发展行 动计划(2020—202…...
java设计模式-模板方法模式
模板方法模式 编写制作豆浆的程序,说明如下 1)制作豆浆的流程选材添加配料浸泡放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 4)请使用模板方法模式完成 说明…...
同步通信、异步通信、并行传输和串行传输
同步通信、异步通信、并行传输和串行传输是通信与数据传输领域的关键概念,它们既相互关联又有本质区别。以下是详细解释和对比: 1. 核心概念分类 通信方式:描述数据传输的时序和协调规则。 同步通信(Synchronous Communi…...
JVM生产环境调优实战
案例三:JVM频繁Full GC优化 1. 项目背景(Situation) 在云中万维跨境支付的反洗钱系统中,我们负责对海量交易数据进行实时规则校验,以确保符合监管要求。系统日均处理交易量超过500万笔,峰值QPS达到3000&a…...
Python: sqlite3.OperationalError: no such table: ***解析
出现该错误说明数据库中没有成功创建 reviews 表。以下是完整的解决方案: 步骤 1:创建数据库表 在插入数据前,必须先执行建表语句。请通过以下任一方式创建表: 方式一:使用 SQLite 命令行 bash 复制 # 进入 SQLit…...
JVM考古现场(十七):鸿蒙初辟——从太极二进到混沌原初的编译天道
"此刻正是奇点编译的第3.1415926秒!伏羲的算筹正在撕裂冯诺依曼架构的次元壁!诸君请看——这JVM堆内存中正在孕育盘古的元神!" 目录(终极扩展) 第一章:太极二进——内存模型的阴阳交缠 第二章&a…...
Python 字典和集合(字典推导)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 字典推导 自 Python 2.7 …...
【AI】prompt engineering
prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程(Prompt Engineering)是指在使用语言模型(如 ChatGPT、文心一言等)等人工智能工具时,设计和优化输入提…...
小刚说C语言刷题——第18讲 循环之while和do-while语句
昨天我们讲了循环语句中的for语句,它主要用于循环次数已知的情况,但是对应循环次数未知的情况,我们又怎么办?这就要用到while和do-while语句了。 1.while语句 (1)语法格式 while(条件表达式) { 循环体; } (2)执行过程 当执…...
[Mysql]buffersize修改
1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld...
自定义数据结构的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“
自定义数据结构放入QVariant,在序列化时抛出异常 ASSERT failure in QVariant::save: “invalid type to save” 自定义数据结构如struct MyData,除了要在结构体后面加 struct MyData { ... } Q_DECLARE_METATYPE(MyData)如果需要用到流的输入输出&…...
带约束的智能优化算法
带约束的智能优化算法 约束条件和优化问题(可改)粒子群算法麻雀搜索算法鲸鱼优化算法灰狼优化算法免疫优化算法人工蜂群算法沙猫群算法萤火虫算法资源 约束条件和优化问题(可改) 粒子群算法 麻雀搜索算法 鲸鱼优化算法 灰狼优化算法 免疫优化算法 人工蜂群算法 沙猫群算法 萤火…...
【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析
🌟【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析🌟 📜 前言:当传统棋艺遇上人工智能 五子棋作为中国传统棋类游戏,规则简单却变化无穷。本文将带你用纯前端技术实现一个具备AI对战功能…...
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南 本文档详细介绍如何使用 kind 创建 Kubernetes 集群,并在其上使用 Helm 部署 StarRocks 集群(非高可用模式)。同时也包括如何访问 StarRocks 集群并导入数据。 目录 前提条件参考文档…...
华为OD全流程解析+备考攻略+经验分享
华为OD全流程解析,备考攻略 快捷目录 华为OD全流程解析,备考攻略一、什么是华为OD?二、什么是华为OD机试?三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…...
数据库中的数组: MySQL与StarRocks的数组操作解析
在现代数据处理中, 数组 (Array) 作为一种高效存储和操作结构化数据的方式, 被广泛应用于日志分析, 用户行为统计, 标签系统等场景. 然而, 不同数据库对数组的支持差异显著. 本文将以MySQL和StarRocks为例, 深入解析它们的数组操作能力, 并对比其适用场景. 文章目录 一 为什么需…...
Qt 交叉编译详细配置指南
一、Qt 交叉编译详细配置 1. 准备工作 1.1 安装交叉编译工具链 # 例如安装ARM工具链(Ubuntu/Debian) sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf# 或者64位ARM sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 1.2 准备目标…...
【详细图文】在VScode中配置python开发环境
目录 一、下载安装VSCode 1、官网下载VSCode 2、安装VSCode 3、汉化vscode (1)已自动下载汉化版插件 (2)未自动下载汉化版插件 二、 下载安装Python 1、官网下载Python 2、安装Python (1)双击打开…...
strings.Fields 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1:官方示例 示例2:解析服务器日志 示例3:清理用户输入 8. 性能比较 性能特点 对比表…...
PCI认证 密钥注入 ECC算法工具 NID_secp521r1 国密算法 openssl 全套证书生成,从证书提取公私钥数组 x,y等
步骤 1.全套证书已经生成。OK 2.找国芯要ECC加密解密签名验签代码。给的逻辑说明没有示例代码很难的上。 3.集成到工具 与SP联调。 1.用openssl全套证书生成及验证 注意:这里CA 签发 KLD 证书用的是SHA256。因为芯片只支持SHA256算法,不支持SHA512。改成统一。…...
微软 SC-900 认证-考核Azure 和 Microsoft 365中的安全、合规和身份管理(SCI)概念
微软 SC-900 认证介绍 SC-900 认证考试是微软推出的一项基础级别认证,全称为 Microsoft Certified: Security, Compliance, and Identity Fundamentals。该认证旨在验证考生对微软云服务(如 Azure 和 Microsoft 365)中的安全、合规和身份管理…...
Uniapp 集成极光推送(JPush)完整指南
文章目录 前言一、准备工作1. 注册极光开发者账号2. 创建应用3. Uniapp项目准备 二、集成极光推送插件方法一:使用UniPush(推荐)方法二:手动集成极光推送SDK 三、配置原生平台参数四、核心功能实现1. 获取RegistrationID2. 设置别…...
OpenCV图像平滑处理方法详解
文章目录 引言一、什么是图像平滑?二、常见的图像平滑方法1.先对图片加上噪声点2. 均值滤波(Averaging)3. 方框滤波(boxFilter)4. 中值滤波(Median Blur)5. 高斯滤波(Gaussian Blur&…...
Lua 中,`math.random` 的详细用法
在 Lua 中,math.random 是用于生成伪随机数的核心函数。以下是其详细用法、注意事项及常见问题的解决方案: Lua 中,math.random 的详细用法—目录 一、基础用法1. 生成随机浮点数(0 ≤ x < 1)2. 生成指定范围的随机…...
使用PX4,gazebo,mavros为旋翼添加下视的相机(仿真采集openrealm数据集-第一步)
目录 一.方法一(没成功) 1.运行PX4 2.运行mavros通讯 3.启动仿真世界和无人机 (1)单独测试相机 (2)make px4_sitl gazebo启动四旋翼iris无人机 二.方法二(成功) 1.通过 rosl…...
ATEngin开发记录_4_使用Premake5 自动化构建跨平台项目文件
该系列只做记录 不做教程 所以文章简洁直接 会列出碰到的问题和解决方案 只适合C萌新 文章目录 Permake5为什么使用 Premake? 项目实战总结一下:详细代码: Permake5 Premake5 是一个跨平台的构建配置工具,它允许开发者通过使用一个简单的脚…...
equals() 和 hashCode()
作为 Java 开发者,我们经常会用到 equals() 和 hashCode() 这两个方法。 它们是 Object 类中定义的基础方法,看似简单,但如果理解不透彻,很容易在实际开发中踩坑。 本文将深入探讨这两个方法的作用、区别、以及如何正确地重写它们…...
臭氧除菌柜市场报告:2031年全球臭氧除菌柜市场销售额预计将达到9.4亿元
一、市场概述 (一)定义与分类 臭氧除菌柜,作为新一代绿色消毒设备,主要利用臭氧(O₃)的强氧化性来实现无化学残留的消毒净化。根据产品类型,可分为单门型和双门型。单门型设计紧凑,…...
解决python manage.py shell ModuleNotFoundError: No module named xxx
报错如下: python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…...
通用接口函数注册模块设计与实现
文章目录 通用接口函数注册模块设计与实现1. 模块概述2. 核心功能2.1 数据结构函数注册项结构体注册函数宏 2.2 核心函数实现函数:sl_register_interface_functions 3. 使用示例3.1 基础使用示例 - 设备驱动接口定义接口结构体实现具体函数创建注册表注册接口 3.2 高…...
C,C++,C#
C、C 和 C# 是三种不同的编程语言,虽然它们名称相似,但在设计目标、语法特性、运行环境和应用场景上有显著区别。以下是它们的核心区别: 1. 设计目标和历史 语言诞生时间设计目标特点C1972(贝尔实验室)面向过程&#…...
scala-集合3
集合计算高级函数 过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 (筛选出满足条件的元素组成新集合。) 转换或映射(map):将原始集合中的元素映射到某个函数。 扁平化:取消…...
Spring MVC 重定向(Redirect)详解
Spring MVC 重定向(Redirect)详解 1. 核心概念与作用 重定向(Redirect) 是 Spring MVC 中一种客户端重定向机制,通过 HTTP 302 状态码(默认)将用户浏览器重定向到指定 URL。 主要用途…...
Scala的集合(二)
1. 集合计算高集函数 任务要求 1)过滤:遍历一个集合并从中获取满足指定条件的元素组成一个新的集合 2)转化/映射(map):将集合中的每一个元素映射到某一个函数 3)扁平化 4)扁平化映射 注:flatMap 相当于先进行 map 操作&#…...
GZ036区块链卷三 EtherGame合约漏洞详解
题目 pragma solidity ^0.8.3; contract EtherGame {uint public targetAmount 7 ether;address public winner;function deposit() public payable {require(msg.value 1 ether, "You can only send 1 Ether");uint balance address(this).balance;require(bala…...
BGP路由协议之路由通告/传递
BGP 的路由宣告 BGP 自身并不会发现并计算产生路由,只会将 IGP 路由表中的路由引入到 BGP 路由表中,并通过 Update 报文传递给 BGP 对等体(邻居) Network 宣告,前提是路由表中存在该条路由 import-route 引…...