简单工厂 、工厂方法模式和抽象工厂模式

简单工厂 、工厂方法模式和抽象工厂模式

1.模式性质与定位

简单工厂:并非正式的设计模式(属编程习惯),通过单一工厂类根据参数判断创建不同产品,本质是将对象创建逻辑集中管理。
工厂方法:是标准的创建型设计模式,定义抽象创建接口,由子类决定实例化哪个具体产品类,强调 “单一产品” 的灵活创建。
抽象工厂:同样是创建型设计模式,聚焦 “产品族” 的创建,一个工厂类负责创建一组相关产品(如手机、耳机、充电器组成的电子产品族)。

2产品创建范围

简单工厂、工厂方法:侧重单个产品的创建。例如,创建 “手机” 这一产品,简单工厂通过条件判断决定具体手机类型,工厂方法通过子类工厂创建特定手机。
抽象工厂:关注多个相关产品的组合创建。如创建 “手机 + 耳机” 的产品族,抽象工厂需定义多个创建方法,分别生成不同类型的产品。

3.扩展性与开闭原则

简单工厂:扩展性差。新增产品时需修改工厂类的创建逻辑(如添加if-else或switch分支),违反开闭原则。
工厂方法:扩展性好。新增产品时,只需定义新的产品类和对应的工厂子类,无需修改原有工厂代码,完全符合开闭原则。
抽象工厂:扩展性较复杂。新增产品族时,可通过扩展工厂子类实现;但新增某一产品类型(如产品族中新增 “平板”),需修改抽象工厂接口及所有具体工厂类,违背开闭原则。

  1. 结构复杂度
    简单工厂:结构最简单,仅一个工厂类处理所有产品创建逻辑。
    工厂方法:复杂度适中,包含抽象产品、具体产品、抽象工厂、具体工厂等类,需为每个产品设计对应的工厂子类。
    抽象工厂:结构最复杂,涉及多个产品接口、多个具体产品类,以及包含多个创建方法的抽象工厂和具体工厂类,代码量和类关系更多。
  2. 典型应用场景
    简单工厂:适用于产品种类少、创建逻辑不复杂,且后续扩展需求低的场景,如简单的日志记录器创建。
    工厂方法:适用于需要灵活扩展产品类型的场景,如不同数据库连接对象的创建(新增数据库类型时,扩展工厂子类即可)。
    抽象工厂:适用于产品需成族搭配使用的场景,如跨平台 UI 组件(Windows 和 Mac 的 “按钮 + 文本框” 组件族,通过抽象工厂创建对应平台的组件组合)。
4. 简单工厂模式
  1. 定义支付接口
public interface Payment {String pay(String orderId, double amount);
}

2.实现微信支付类

public class WeChatPayment implements Payment {@Overridepublic String pay(String orderId, double amount) {return "使用微信支付,订单号:" + orderId + ",金额:" + amount;}
}

3.实现支付宝支付类

public class AlipayPayment implements Payment {@Overridepublic String pay(String orderId, double amount) {return "使用支付宝支付,订单号:" + orderId + ",金额:" + amount;}
}
  1. 创建简单工厂类
public class PaymentFactory {public static Payment createPayment(String payType) {if ("wechat".equals(payType)) {return new WeChatPayment();} else if ("alipay".equals(payType)) {return new AlipayPayment();}return null;}
}
  1. 客户端调用
public class 

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

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

相关文章

热图回归(Heatmap Regression)

热图回归(Heatmap Regression)是一种常用于关键点估计任务的方法,特别是在人体姿态估计中。它的基本思想是通过生成热图来表示某个关键点在图像中出现的概率或强度。以下是热图回归的主要特点和工作原理: 主要特点 热图表示: 每个关键点对应一个热图,热图中的每个像素值…

Word 小黑第15套

对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 (脚注默认位于底部 )在脚注插入文档属性: -插入 -文档部件 -域 类别选择文档信息,域…

Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

Python里matplotlib不显示中文的问题

在很长一段时间里用Python绘图,matplotlib都不能很好的显示中文,起初是认为我的pycharm里的设置问题,但是发现同样的问题在spyder里也同样的出现。 一共有两种解决方案,我强烈推荐第一种,因为更为方便,绘图…

JavaWeb-servlet6中request和response的使用

HttpServletRequest HttpServletRequest 继承自 ServletRequest。客户端浏览器发出的请求被封装成为一个 HttpServletRequest对象。 对象包含了客户端请求信息包括请求的地址,请求的参数,提交的数据,上传的文件客户端的ip甚至客户端操作系统…

机器学习(吴恩达)

一, 机器学习 机器学习定义: 计算机能够在没有明确的编程情况下学习 特征: 特征是描述样本的属性或变量,是模型用来学习和预测的基础。如: 房屋面积, 地理位置 标签: 监督学习中需要预测的目标变量,是模型的输出目标。如: 房屋价格 样本: 如: {面积100㎡…

CNN的激活函数

我们来对比 Sigmoid、Softmax 和 ReLU 这三种激活函数的相同点和不同点,并分别说明它们相较于其他两种激活函数的优点。 相同点 都是非线性激活函数: 这三种激活函数都能为神经网络引入非线性特性,使网络能够学习复杂的模式。 广泛应用于深度…

Oracle数据恢复:闪回查询

Oracle数据恢复:闪回查询 SQL语法闪回查询:AS OF闪回版本查询:VERSIONS BETWEEN数据恢复示例闪回查询最佳实践应用场景使用限制注意事项最佳实践在误删除业务数据时,Oracle数据库通常支持以下几种数据恢复途径。 闪回查询(Flashback Query):闪回查询通过查询系统的UNDO数…

【MySQL篇】MySQL内置函数

目录 1,日期函数 2,字符串函数 3,数学函数 4,其他函数 实战OJ 1,日期函数 日期类型在之前文章【数据类型】中有描述 传送门:【MySQL篇】数据类型_mysql 数据类型-CSDN博客 函数名称描述current_dat…

苹果iOS 18.4将强制升级HomeKit架构,旧版设备或无法使用

在科技飞速发展的当下,智能家居领域也在不断革新。而苹果公司作为科技行业的巨头,其每一次动作都备受关注。近日,有消息称苹果计划在iOS 18.4版本中停止对旧版HomeKit架构的支持,这一举措意味着用户将被迫升级,也可能对众多使用Apple Home应用的智能家居设备用户产生深远影…

故障诊断——neo4j入门

文章目录 neo4jQuickStartDemo neo4j QuickStart 详情可见博客:https://www.cnblogs.com/nhdlb/p/18703804,使用docker拉取最近的一个版本进行创建 docker run -it -d -p 7474:7474 -p 7687:7687 \ -v /disk5/neo4j_docker/data:/data \ -v /disk5/ne…

《苍穹外卖》SpringBoot后端开发项目核心知识点与常见问题整理(DAY1 to DAY3)

目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功: 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具:Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…

大模型安全新范式:DeepSeek一体机内容安全卫士发布

2月以来,DeepSeek一体机几乎成为了政企市场AI消费的最强热点。 通过一体机的方式能够缩短大模型部署周期,深度结合业务场景,降低中小企业对于大模型的使用门槛。据不完全统计,已约有超过60家企业基于DeepSeek推出一体机产品。 但…

OpenHarmony-SELinux配置

前言: OpenHarmony 上某个进程向samgr注册SA服务,其他进程在与该进程进行IPC通信之前,需要获取该SA服务,SA提供方需要为该SA配置SELinux标签,否则该SA会被SELinux配置为u:object_r:default_service:s0标签&#xff0c…

SQL开发中改善查询性能的N种写法

文章目录 1. 使用 SELECT *2. 在 WHERE 子句中使用函数或计算3. 使用隐式类型转换4. 不使用索引的列进行连接(JOIN)或过滤5. 使用 OR 代替 IN6. 在子查询中使用 SELECT *7. 忽略索引统计信息8. 嵌套子查询过多9. 过度使用 DISTINCT10. 使用不当的 JOIN 类…

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机:必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add,可能会导致Wait方法提前返回,因为计数器没有正确反映正在运行的goroutine的数量…

数字IC后端项目典型问题(2025.03.10数字后端项目问题记录)

小编发现今天广大学员发过来的问题都比较好,立即一顿输出分享给大家(每天都有好多种类的数字后端问题)。后续可能会经常通过这种方式来做分享。其实很多问题都是实际后端项目中经常遇到的典型问题。希望通过这种方式的分享能够帮助到更多需要…

课程《Deep Learning Specialization》

在coursera上,Deep Learning Specialization 课程内容如下图所示: Week2 assignment, Logistic Regression.

LLM推理和优化(1):基本概念介绍

一、LLM推理的核心过程:自回归生成 LLM(如DeepSeek、ChatGPT、LLaMA系列等)的推理本质是自回归生成:从初始输入(如[CLS]或用户prompt)开始,逐token预测下一个词,直到生成结束符&…

【从零开始学习计算机科学】编译原理(一)编译过程概述

【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…