设计模式之工厂模式解析工厂模式是创建型设计模式中最常用的一种它提供了一种创建对象的最佳方式。在工厂模式中我们不直接使用new关键字创建对象而是通过一个共同的接口来创建对象将对象的创建过程封装起来让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。工厂模式的核心思想工厂模式的核心在于“封装变化”。在软件系统中对象的创建过程常常面临着变化比如需要根据不同的配置创建不同的对象或者创建过程非常复杂需要封装。工厂模式通过定义一个创建对象的接口让子类决定实例化哪一个类将对象的创建与使用分离从而降低系统的耦合度。工厂模式主要解决接口选择的问题。当系统需要扩展时我们不需要修改原有的代码只需要增加新的工厂类即可这完全符合“开闭原则”——对扩展开放对修改关闭。工厂模式的三种形式简单工厂模式简单工厂模式又称为静态工厂方法模式它通过一个静态方法来创建对象。虽然它不属于GoF的23种设计模式但它是工厂模式的最简单形式。javapublic class SimpleFactory {public static Product createProduct(String type) {if (A.equals(type)) {return new ConcreteProductA();} else if (B.equals(type)) {return new ConcreteProductB();}return null;}}简单工厂模式的优点是客户端无需知道具体产品的类名只需要知道具体产品对应的参数即可。缺点是工厂类集中了所有产品的创建逻辑一旦不能正常工作整个系统都会受到影响而且当产品种类增多时工厂类的代码会变得非常复杂违背了开闭原则。工厂方法模式工厂方法模式定义了一个创建对象的接口但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。javapublic abstract class Factory {public abstract Product createProduct();public void doSomething() {Product product createProduct();// 使用product}}public class ConcreteFactoryA extends Factory {Overridepublic Product createProduct() {return new ConcreteProductA();}}工厂方法模式的优点是用户只需要关心所需产品对应的工厂无需关心创建细节在系统增加新的产品时只需要添加相应的具体工厂类无需修改原有代码符合开闭原则。缺点是类的个数容易过多增加了系统的复杂度。抽象工厂模式抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口而无需指定它们具体的类。抽象工厂模式是工厂方法模式的升级版工厂方法模式只生产一个等级的产品而抽象工厂模式可生产多个等级的产品。javapublic interface AbstractFactory {Phone createPhone();Tablet createTablet();}public class AppleFactory implements AbstractFactory {Overridepublic Phone createPhone() {return new iPhone();}Overridepublic Tablet createTablet() {return new iPad();}}抽象工厂模式的优点是当一个产品族中的多个对象被设计成一起工作时它能保证客户端始终只使用同一个产品族中的对象增加新的产品族很容易符合开闭原则。缺点是产品族扩展非常困难如果需要增加一个新的产品类型就需要修改抽象工厂和所有具体工厂类。工厂模式的应用场景工厂模式在软件开发中有着广泛的应用以下是一些典型场景1. 日志记录器记录日志到本地硬盘、系统事件、远程服务器等用户可以选择记录日志到什么地方。2. 数据库访问系统可能支持多种数据库如MySQL、Oracle、SQL Server等用户可以选择使用哪种数据库。3. 连接服务器的通信方式可以通过多种通信方式如HTTP、WebService、Socket等进行连接。4. 加密算法系统可能需要提供多种加密算法如DES、AES、RSA等。5. 跨平台UI控件在不同操作系统下需要创建不同的UI控件但代码逻辑应保持一致。工厂模式的优缺点分析优点1. 封装性好客户端不需要知道具体产品类的类名只需要知道对应的工厂即可。2. 扩展性好增加新的产品时只需要增加相应的具体工厂类无需修改原有代码。3. 屏蔽产品类产品类的实现如何变化调用者都不需要关心只需要关心产品的接口。4. 解耦将对象的创建与使用分离降低了系统的耦合度。缺点1. 增加复杂度每增加一个产品就需要增加一个具体工厂类增加了系统的复杂度。2. 抽象困难抽象工厂模式中产品族的扩展比较困难。3. 系统抽象性提高引入了抽象层增加了系统的抽象性和理解难度。工厂模式在实际项目中的应用在实际项目中工厂模式常常与其他模式结合使用。例如在Spring框架中BeanFactory就是工厂模式的典型应用。Spring通过BeanFactory来创建和管理所有的Bean对象用户只需要通过配置文件或注解来定义BeanSpring容器负责创建和管理这些Bean的生命周期。另一个典型例子是JDK中的Calendar类。Calendar.getInstance()方法就是一个工厂方法它根据本地时区返回一个Calendar对象用户无需关心具体是哪个Calendar子类被实例化。工厂模式的演进与变体随着软件开发实践的发展工厂模式也衍生出一些变体1. 延迟初始化工厂工厂可以缓存已经创建的对象当再次请求相同的对象时直接返回缓存的对象。2. 参数化工厂工厂方法可以接受参数根据不同的参数创建不同的对象。3. 依赖注入现代框架如Spring通过依赖注入实现了更灵活的工厂模式将对象的创建和依赖关系的管理完全交给容器。总结工厂模式是面向对象设计中极其重要的模式之一它体现了面向对象设计的多个原则开闭原则、依赖倒置原则、单一职责原则等。通过合理使用工厂模式我们可以创建出更加灵活、可扩展、可维护的软件系统。在实际开发中我们需要根据具体需求选择合适的工厂模式变体。对于简单的创建逻辑简单工厂可能就足够了对于需要灵活扩展的场景工厂方法模式更为合适而对于需要创建一系列相关对象的场景抽象工厂模式是最佳选择。理解工厂模式不仅有助于我们编写更好的代码更重要的是它培养了我们一种思维方式——如何通过封装变化来构建更加稳定、灵活的软件架构。这种思维方式是每一位软件工程师都应该掌握的核心技能之一。
3款国产大模型终端集成方案对比:小米浏览器接入豆包 vs 华为鸿蒙 vs OPPO小布 国产大模型终端集成方案深度对比:小米豆包、华为鸿蒙与OPPO小布的技术路径与商业逻辑 当手机浏览器开始理解自然语言提问,当车载语音助手能预判你的行程需求,当智能手表主动提醒今天的会议要点——这些场景背后,是AI大模型与终端设…
【计算机大数据毕业设计案例】基于时序数据的电商用户画像动态更新系统的设计与实现 基于用户行为数据的电商画像营销分析系统(程序+文档+讲解+定制) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…
存在强度:知识图谱中实体显著性的拓扑-语义协同度量框架(世毫九实验室原创研究) 存在强度:知识图谱中实体显著性的拓扑-语义协同度量框架(世毫九实验室原创研究) 作者:方见华 单位:世毫九实验室 摘要 知识图谱中实体的显著性由内在属性与外在关系网络共同决定,但现有实体表示与重要性度量…
阿里千问智能体功能2026年下线:数据备份与迁移完整指南 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 阿里千问平台近日发布重要公告,拟人化互动类智能体及用户自建智能体功能将于2026年7月10日正式下线。这是继豆包之后又一主…
NOTA-C6-Amine,六碳烷基氨基-NOTA的结构特点与应用介绍 一、概述 NOTA-C6-Amine,也称六碳烷基氨基-NOTA,是一种基于 NOTA(1,4,7-三氮杂环壬烷-1,4,7-三乙酸)骨架设计的功能化配体分子。该类化合物通过在 NOTA 分子结构中引入含六个碳链长度的烷基氨基连接单元,使分子在原有配…
环保行业数字化转型新思路:线上产业平台助力行业降本增效 传统环保行业线下拓客模式存在诸多痛点:频繁线下参展、实地走访,时间与资金成本高,供需双方信息不对称,厂商获客、工程商寻源效率偏低。依托线上数字化产业平台,能够有效解决行业现存经营难题。 一、线上展厅ÿ…
蜂鸣器声光报警+功能按键+激光测距模块1(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_ 蜂鸣器声光报警功能按键激光测距模块1(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 特点: 本产品主要采用激光传感器检测当前的距离,激光检测的距离为0.03M到2米之间,大家可能会问是不是检测距离太短了&am…
008-YOLO11图片和标签同步增强-九类增强方法的边界与风险 008-YOLO11 图片和标签同步增强:九类增强方法的边界与风险本文基于 Ultralytics 8.3.253 整理 YOLO11 目标检测训练中的数据增强参数。重点不是把所有增强都打开,而是讲清楚哪些增强只改图片、哪些增强必须同步修改标签,以及不同场景下应该怎…
蚂蚁灵波推空间感知模型 LingBot-Depth 2.0 并开源视觉基座模型,精度与稳定性双突破! 【导语:2026 年 1 月开源 LingBot-Depth 1.0 后,蚂蚁集团旗下灵波科技推出全新一代空间感知模型 LingBot-Depth 2.0,还同步开源视觉基座模型 LingBot-Vision,在性能和训练范式上取得显著突破。】训练数据扩充,LingBot-…
Unity WebGL部署Apache Tomcat:MIME配置、Gzip压缩与缓存优化实战 1. 项目概述:当Unity WebGL遇上Apache Tomcat如果你是一名Unity开发者,想把精心制作的WebGL游戏或应用部署到自己的服务器上,那么Apache Tomcat大概率是你绕不开的一环。这不仅仅是把一堆构建出来的文件扔进一个文件夹那么简单。我见过太多项…
掌握Docker多阶段构建镜像优化技巧 掌握Docker多阶段构建镜像优化技巧在容器化技术日益普及的今天,Docker已成为开发与运维领域的基石工具。然而,随着应用复杂度提升,构建出的Docker镜像体积庞大、层数繁多、安全性欠佳等问题逐渐凸显,直接影响着部署效率、传输速度…
Ansible的AWX与作业模板调度 在当今快速迭代的IT运维与开发领域,自动化已成为提升效率、保障一致性的核心支柱。Ansible作为一款强大的IT自动化工具,以其无代理、简单易用的特点广受欢迎。而AWX,作为Ansible上游项目提供的企业级Web界面、API及任务引擎,则将A…
3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 3步彻底解决Windows右键菜单混乱问题:ContextMenuManager使用全攻略 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾为Windows右键菜单中那些…
GXDE OS下Wayland兼容性实战:从deepin-mutter原理到VMware Tools修复 如果你正在用 GXDE OS 或者任何基于 Deepin 的发行版,并且遇到了“检测到窗口系统采用 Wayland 协议,程序即将退出”这类弹窗,或者发现 VMware Tools 在 Ubuntu 24.04 这类默认 Wayland 的系统上启动失败,那这篇文章就是为你准备的…
企业AI落地困境与AgenticOps实践指南 1. 企业AI落地的现实困境与破局之道过去两年,大模型技术呈现爆发式增长,从GPT-3到GPT-4,从LLaMA到DeepSeek,模型参数规模从百亿级跃升至万亿级,多模态能力从单一文本扩展到图文音视频的综合处理。然而在企业应用层面&a…
[C++]内存管理:串顺序存储的内存回收 在串(字符串)的顺序存储中,内存回收的方式取决于字符串的存储方式以及所使用的编程语言和相关库。以下以 C 为例进行说明,因为 C 对内存管理有较为直接的控制。 1. 基于 char 数组的串顺序存储 如果使用普通的 char 数组来存储字…
移动端游戏功耗测试实战:电流、功率、亮度和场景对比 移动端游戏功耗测试:先控制变量,再比较优化是否真的省电 摘要:功耗测试最容易犯的错误,是拿两次不同温度、不同亮度、不同场景的平均功率直接比较。本文给出一套可复现的游戏功耗测试方法,覆盖引擎特性验证、版本回归和黑盒体验测试,并说明如何把功耗与帧率、温控、CPU/G…
足球口袋教练 HarmonyOS 离线应用实战(03/20):ArkUI 首页仪表盘搭建 本文是“足球口袋教练 HarmonyOS 离线应用实战”系列第 3 篇。示例项目是一个 HarmonyOS / ArkTS / ArkUI 编写的离线足球训练助手,围绕真实页面、真实截图和可复现操作展开。 本篇要解决的问题 训练 App 的首页不能只展示欢迎语,它要解决“我现在该点哪…