Java 23 种设计模式:从踩坑到精通 | 工厂模式 —— 还在写一坨 if-else?简单工厂→工厂方法→抽象工厂全演进

设计模式之简单工厂、工厂方法和抽象工厂 创建型模式之工厂方法模式笔记 阅读详情

Java 23 种设计模式:从踩坑到精通 | 工厂模式 —— 还在写一坨 if-else?简单工厂→工厂方法→抽象工厂全演进

摘要:还在用一坨 if-else 创建对象?本文带你走完 简单工厂→工厂方法→抽象工厂 的完整演进路线,附 JDK、Spring、MyBatis 源码案例,彻底搞懂三种工厂的区别与选型。

📖 《Java 23 种设计模式:从踩坑到精通》
开篇:系列介绍与目录 | 上一篇:单例模式 | 当前:工厂模式 | 下一篇:抽象工厂模式
🔗 返回系列总目录


1. 从一段“if-else”屎山说起

看看下面这段代码,你是不是也曾在项目里这样写过:

if (type.equals("sms")) {
    sender = new SmsSender();
} else if (type.equals("email")) {
    sender = new EmailSender();
} else if (type.equals("wechat")) {
    sender = new WechatSender();
}

这段代码看似简单,却藏着三个致命问题:

  • 紧耦合:客户端代码直接依赖 SmsSender、EmailSender 等具体类,一旦类名或构造函数变化,所有调用方都要改。
  • 违反 OCP:每加一种渠道就要修改 if-else,而修改现有代码可能引入新的 Bug。
  • 单元测试困难:无法注入 Mock 对象,测试时必须真实创建所有依赖。

工厂模式的核心使命就是:把对象的创建和使用分离,让变化集中在 Factory,调用方只依赖抽象接口。


2. 模式家族的三种形态

工厂模式不是单一模式,而是一个“三兄弟”家族:
模式家族的三种形态

对比维度简单工厂工厂方法抽象工厂
类图复杂度★★★★★★
核心思想一个工厂根据参数创建不同产品让子类决定实例化哪个产品创建一系列相关产品族
产品数量多种产品共用一个工厂每个产品对应一个工厂一个工厂生产一族产品
开闭原则违反符合符合(产品族维度)

2.1 一分钟选型指南

你的场景推荐模式一句话理由
产品种类少(≤3种)且基本不变简单工厂够用就好,过度设计无益
产品种类多、频繁新增工厂方法新增产品只需新加工厂类,符合开闭原则
产品成族出现、需整体切换抽象工厂如支付渠道、跨平台UI,保证产品族一致

📌 提示:简单工厂并不在 GoF 23 种设计模式之列,但它是最常用的编程习惯,也是理解工厂方法的基础。


3. 简单工厂模式 —— 把 if-else 搬个家

3.1 UML 类图

Simple Factory

三个角色:

  • 抽象产品(Product) :定义产品的公共接口;
  • 具体产品(ConcreteProduct) :实现抽象产品接口;
  • 工厂类(Factory) :根据参数判断,返回对应的具体产品实例。

3.2 代码实现:消息发送器

① 抽象产品

public interface Sender {
    void send(String message);
}

② 具体产品

public class SmsSender implements Sender {
    @Override
    public void send(String message) {
        System.out.println("【短信】发送:" + message);
    }
}

public class EmailSender implements Sender {
    @Override
    public void send(String message) {
        System.out.println("【邮件】发送:" + message);
    }
}

③ 简单工厂

public class SenderFactory {
    public static Sender create(String type) {
        switch (type) {
            case "sms":   return new SmsSender();
            case "email": return new EmailSender();
            default: throw new IllegalArgumentException("未知渠道类型:" + type);
        }
    }
}

⚠️ 简单工厂只是把 if-else 搬了家,新增产品仍需修改工厂类,违反开闭原则。

④ 客户端调用

Sender sender = SenderFactory.create("sms");
sender.send("你好,工厂模式!");

3.3 优缺点

优点缺点
客户端与具体产品解耦,职责清晰违反开闭原则:新增产品必须修改 switch 逻辑
创建逻辑集中管理,调用简单工厂类职责过重,所有产品的创建压力集中在一个类中
适合产品种类少、变化不频繁的场景使用静态方法,工厂类无法形成基于继承的等级结构

⚠️ 核心矛盾:简单工厂只是把 if-else 从业务代码搬到了工厂类,本质上没有消除 switch。当产品种类持续增长时,工厂类会变成“超级工厂”。


4. 工厂方法模式 —— 把变化隔离到子类

4.1 核心思想

简单工厂用一个类扛所有创建逻辑,工厂方法模式则把“创建”这个动作抽象成接口,让每个具体产品都有一个对应的具体工厂来创建。

一句话理解:简单工厂是“我去找工厂要产品”,工厂方法是“我去找具体的工厂子类要它擅长的产品”。

4.2 UML 类图

SenderFactory

四个角色:

  • 抽象工厂(Factory) :声明创建产品的工厂方法,返回抽象产品类型;
  • 具体工厂(ConcreteFactory) :实现工厂方法,返回一个具体产品实例;
  • 抽象产品(Product) :定义产品的公共接口;
  • 具体产品(ConcreteProduct) :实现抽象产品接口。

4.3 代码实现

① 抽象工厂接口

public interface SenderFactory {
    Sender createSender();
}

② 具体工厂类

public class SmsSenderFactory implements SenderFactory {
    @Override
    public Sender createSender() {
        return new SmsSender();
    }
}

public class EmailSenderFactory implements SenderFactory {
    @Override
    public Sender createSender() {
        return new EmailSender();
    }
}

✅ 新增产品只需新加工厂子类,完全符合开闭原则;但每种产品都要对应一个工厂类,类数量会膨胀。
③ 客户端调用

SenderFactory factory = new SmsSenderFactory();
Sender sender = factory.createSender();
sender.send("你好,工厂方法!");

4.4 优缺点

优点缺点
完全符合开闭原则:新增产品只需新增一个工厂子类,零修改现有代码类的数量会急剧膨胀,每个产品都要配一个工厂类
每个工厂职责单一,逻辑清晰系统复杂度增加,适合产品种类较多的场景
支持基于继承的工厂等级结构客户端需要知道具体工厂类的名字

5. 抽象工厂模式 —— 产品族一键创建

5.1 核心思想

工厂方法解决的是单一产品的创建问题,但现实开发中,我们常常需要同时创建一系列相互关联的产品(称为“产品族”)。例如一个跨平台 UI 组件库需要同时创建按钮、文本框,且必须保证它们风格统一(全 Win 风格或全 Mac 风格)。

抽象工厂模式正是为此而生:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

5.2 两个关键概念

  • 产品等级结构:即产品的继承结构,例如按钮是一个抽象类,Windows 按钮和 Mac 按钮是其具体子类。
  • 产品族:由同一个工厂生产的、位于不同产品等级结构中的一组产品。例如 Windows 工厂生产的 Windows 按钮 + Windows 文本框,构成一个产品族。

5.3 UML 类图

GUIFactory
四个角色:

  • 抽象工厂(AbstractFactory) :声明一组创建产品族的方法;
  • 具体工厂(ConcreteFactory) :实现抽象工厂,生成一个产品族的所有产品;
  • 抽象产品(AbstractProduct) :为每种产品声明接口;
  • 具体产品(ConcreteProduct) :定义具体工厂生产的具体产品对象。

5.4 代码实现:跨平台 UI 组件

① 抽象产品

public interface Button {
    void paint();
}

public interface TextField {
    void render();
}

② 具体产品(Windows 风格)

public class WinButton implements Button {
    @Override
    public void paint() {
        System.out.println("Windows 风格按钮");
    }
}

public class WinTextField implements TextField {
    @Override
    public void render() {
        System.out.println("Windows 风格文本框");
    }
}

③ 具体产品(Mac 风格)

public class MacButton implements Button {
    @Override
    public void paint() {
        System.out.println("Mac 风格按钮");
    }
}

public class MacTextField implements TextField {
    @Override
    public void render() {
        System.out.println("Mac 风格文本框");
    }
}

④ 抽象工厂

public interface GUIFactory {
    Button createButton();
    TextField createTextField();
}

⑤ 具体工厂

public class WinFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WinButton();
    }
    @Override
    public TextField createTextField() {
        return new WinTextField();
    }
}

public class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }
    @Override
    public TextField createTextField() {
        return new MacTextField();
    }
}

✅ 保证产品族一致性,切换工厂即可整体换肤;⚠️ 新增产品类型(如新增 Checkbox)需要修改所有工厂类。

⑥ 客户端调用

GUIFactory factory = new WinFactory();   // 只需切换这一行
Button button = factory.createButton();
TextField textField = factory.createTextField();
button.paint();        // Windows 风格按钮
textField.render();    // Windows 风格文本框

5.5 优缺点

优点缺点
保证产品族兼容性:所有产品来自同一工厂,风格/协议一致新增产品等级困难:如果要新增一个 Checkbox 产品,抽象工厂和所有具体工厂都要修改
客户端代码与具体平台/产品族解耦类的数量进一步膨胀,系统更加复杂
切换产品族只需替换工厂实例仅适用于存在产品族且产品等级相对稳定的场景

6. 工厂模式进化三步走

回顾三种模式的演进,你会发现它们解决的问题层层递进:
工厂模式进化三步走

选型指南:

场景推荐模式判断依据
产品种类少(≤3 种)且基本不变简单工厂代码最简单,过度设计无益
产品种类多、频繁新增工厂方法新增产品只需新增工厂类,符合 OCP
产品成族出现、需整体切换抽象工厂如 UI 主题、数据库驱动、支付渠道家族

💡 黄金法则:能用简单工厂就别上工厂方法,能用工厂方法就别上抽象工厂。模式是为解决问题服务的,不是为了炫技。


📌 正在追更《Java 23 种设计模式:从踩坑到精通》?
点击右上角「关注」,不错过下一篇——抽象工厂:产品族创建,如何避免“一锅粥”?


7. 框架中的工厂模式

7.1 JDK:Calendar.getInstance() —— 简单工厂

JDK 中的 java.util.Calendar 类是简单工厂模式的经典应用。

// JDK 源码简化示意
public abstract class Calendar {
    public static Calendar getInstance() {
        return createCalendar(TimeZone.getDefault(), Locale.getDefault());
    }

    private static Calendar createCalendar(TimeZone zone, Locale locale) {
        // 根据地区和语言,返回不同的 Calendar 子类实例
        if ("th".equals(locale.getLanguage()) && "TH".equals(locale.getCountry())) {
            return new BuddhistCalendar(zone, locale);
        }
        return new GregorianCalendar(zone, locale);
    }
}

调用方只需 Calendar.getInstance(),无需知道背后到底是 GregorianCalendar 还是 BuddhistCalendar。

7.2 Spring IoC 容器 —— 工厂方法 + 抽象工厂

Spring 的 BeanFactory 是工厂方法模式的经典实现。

// BeanFactory 是抽象工厂,声明了获取 Bean 的接口
public interface BeanFactory {
    Object getBean(String name);
    <T> T getBean(Class<T> requiredType);
    // ...
}

而 FactoryBean<T> 则是工厂方法的进一步封装——它本身是一个 Bean,但其 getObject() 方法负责创建并返回另一个复杂对象。

BeanFactory 是管理所有 Bean 的容器本身(抽象工厂),而 FactoryBean 是容器中用于生产特定复杂对象的特殊 Bean(工厂方法)。二者一纵一横,共同构成了 Spring 强大的对象创建体系。

7.3 MyBatis:SqlSessionFactory —— 抽象工厂

MyBatis 的 SqlSessionFactory 负责创建 SqlSession 实例,涉及数据库连接、事务管理等复杂配置,是典型的抽象工厂模式:

public interface SqlSessionFactory {
    SqlSession openSession();
    // ...
}

8. 常见误区与面试高频题

❌ 误区1:简单工厂就是工厂方法
简单工厂不属于 GoF 23 种设计模式,它使用静态方法且只有一个工厂类;工厂方法则通过抽象工厂接口 + 多个具体工厂子类实现多态创建。

❌ 误区2:工厂方法可以替代简单工厂
如果产品种类很少且变化不大,简单工厂足够用了。强行上工厂方法只会导致类数量膨胀,得不偿失。

❌ 误区3:抽象工厂比工厂方法“高级”
它们是解决不同问题的工具,不存在高低之分。如果产品之间不构成“产品族”,抽象工厂反而是过度设计。

💡 面试高频追问

  • 简单工厂违背了什么原则? → 开闭原则(OCP),新增产品需修改工厂类中的 switch 逻辑。
  • 工厂方法和抽象工厂的本质区别是什么? → 工厂方法解决单一产品的横向扩展,抽象工厂解决产品族的纵向创建。
  • BeanFactory 和 FactoryBean 分别是什么模式? → BeanFactory 是抽象工厂模式,FactoryBean 是工厂方法模式。

9. 六大设计原则在工厂模式中的体现

设计原则在工厂模式中的体现
单一职责原则(SRP)每个具体工厂只负责创建一种产品,职责内聚
开闭原则(OCP)工厂方法新增产品只需加新工厂类,无需修改现有代码
里氏替换原则(LSP)客户端使用抽象产品类型,具体产品可任意替换
依赖倒置原则(DIP)客户端依赖抽象工厂和抽象产品接口,而非具体实现类
接口隔离原则(ISP)抽象工厂按产品族维度拆分接口,避免“胖接口”
迪米特法则(LoD)客户端只需知道工厂和产品接口,无需了解内部创建细节

10. 总结对比一览

对比维度简单工厂工厂方法抽象工厂
GoF 收录否是是
工厂数量1 个N 个(每产品一工厂)N 个(每产品族一工厂)
产品数量多种一种(每工厂)一族(多产品)
开闭原则违反符合部分符合
类复杂度★☆☆☆★★★☆★★★★
推荐指数★★★☆★★★★★★★★★
典型应用Calendar.getInstance()Spring FactoryBeanMyBatis SqlSessionFactory

✅ 建议:日常开发中,优先考虑简单工厂(够用即止);产品种类多且频繁扩展时升级为工厂方法;系统存在产品族概念时(如多端 UI、多数据库)果断使用抽象工厂。


附录:| Factory UML 源码

Simple Factory UML 源码

@startuml
skinparam backgroundColor #FEFEFE
interface Product {
  + operation()
}
class ConcreteProductA implements Product
class ConcreteProductB implements Product
class SimpleFactory {
  + createProduct(type) : Product
}
SimpleFactory ..> Product : creates
@enduml

SenderFactory UML 源码

@startuml
skinparam backgroundColor #FEFEFE
skinparam classBorderColor #333333
skinparam classFontColor #333333
skinparam arrowColor #555555
skinparam classBackgroundColor #F9F9F9

interface SenderFactory {
  + createSender(): Sender
}

class SmsSenderFactory implements SenderFactory {
  + createSender(): Sender
}

class EmailSenderFactory implements SenderFactory {
  + createSender(): Sender
}

interface Sender {
  + send(message: String): void
}

class SmsSender implements Sender {
  + send(message: String): void
}

class EmailSender implements Sender {
  + send(message: String): void
}

SmsSenderFactory ..> SmsSender : creates
EmailSenderFactory ..> EmailSender : creates
@enduml

GUIFactory UML 源码

@startuml
skinparam backgroundColor #FEFEFE
skinparam classBorderColor #333333
skinparam classFontColor #333333
skinparam arrowColor #555555
skinparam classBackgroundColor #F9F9F9

interface GUIFactory {
  + createButton(): Button
  + createTextField(): TextField
}

class WinFactory implements GUIFactory {
  + createButton(): Button
  + createTextField(): TextField
}

class MacFactory implements GUIFactory {
  + createButton(): Button
  + createTextField(): TextField
}

interface Button {
  + paint(): void
}

interface TextField {
  + render(): void
}

class WinButton implements Button {
  + paint(): void
}

class MacButton implements Button {
  + paint(): void
}

class WinTextField implements TextField {
  + render(): void
}

class MacTextField implements TextField {
  + render(): void
}

WinFactory ..> WinButton : creates
WinFactory ..> WinTextField : creates
MacFactory ..> MacButton : creates
MacFactory ..> MacTextField : creates
@enduml

🧭 《Java 23 种设计模式:从踩坑到精通》快速导航

🔔 关注《Java 23 种设计模式:从踩坑到精通》,用 25 篇文章彻底吃透设计模式,让代码设计成为你的本能。
📦 福利预告:全系列代码及 UML 源码将在完结时统一打包开放,点击「关注」「收藏」第一时间获取。
🚀 下一篇:抽象工厂模式——支付渠道 + 收款渠道如何保证成套创建?跨平台 UI 如何一键换肤?
📌 除了设计模式,我也在深挖智能物流实战(出版社WMS、托盘调度、机器学习落地)。如果你对技术在不同领域的实战感兴趣,欢迎点击我的头像,看看专栏《出版社物流WMS智能调度实战》。技术相通,思路可鉴。

PyTorch复现PSMNet踩坑全记录:从环境配置到KITTI数据集训练 本文详细记录了使用PyTorch复现CVPR经典立体匹配模型PSMNet的全过程,从环境配置到KITTI数据集训练,特别针对2023年主流软硬件环境中的常见问题提供解决方案。文章重点介绍了PSMNet的金字塔池化模块和堆叠沙漏结构,帮助研究者和工程师快速实现工业级深度估计,节省大量试错时间。 阅读详情

相关推荐

【Collibra 驱动 IPD 数据血缘治理】:三层图谱分层展示体系与全链路追踪的技术业务实践

(应用级/数据级/字段级)是理解复杂数据流动的核心手段。其价值不仅体现在可视化的直观性,更在于通过。技术保障血缘不可篡改性,进一步提升IPD数据治理的可靠性。,解决了跨层级血缘分析的性能与可用性矛盾。数据血缘图谱要素定义(字节跳动/腾讯云/信安标委)实现对IPD数据的精准追踪,而数据血缘图谱的。分层交互设计标准(智慧城市数据中台规范)Collibra技术文档(2024)字段级血缘的挑战与解决路径。自动优化血缘路径,并深化。字段级血缘技术实现方案。Collibra通过。图数据库性能优化原理。

百态·数智思维 | 聚焦大数据、量化与未来AI 1232

Java 中的 23 种设计模式详解

项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

微笑听雨 7万+

kbjdbc: autodetected server-encoding to be ISO-8859-1, if the message is not readable, please check

这条信息是来自 KingbaseES 数据库的一个 JDBC 客户端连接提示。KingbaseES 是一个企业级的关系型数据库管理系统,它兼容 PostgreSQL 的许多特性。如果上述步骤仍然无法解决问题,建议详细查看数据库和客户端的日志文件,以获取更具体的错误信息。此外,也可以考虑联系 KingbaseES 的技术支持获取帮助。项目融合kingbase数据库,输出日志乱码。结果:网上各种调整各种试。

zjy660358的专栏 4837

Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍

摘要:本文是《Java 23种设计模式:从踩坑到精通》系列的总入口与导航页。文章梳理了设计模式的起源与三大分类,结合SOLID六大原则,详解为什么2026年设计模式依然重要。提供25篇完整目录、面试高频Top10速记、场景速查索引、易混模式对比表及分级阅读路线,可作为长期收藏的设计模式学习手册。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 3333

Rockchip平台Android相机HAL3开发实战:从配置到调试全流程解析

本文深入解析了Rockchip平台Android相机HAL3的开发全流程。从理解AAL与PSL核心架构、解析关键配置文件(如camera3_profiles.xml和Tuning文件),到搭建编译环境、进行增量部署,并提供了系统日志分析、V4L2调试等高级问题排查技巧,为开发者提供了一套从配置到调试的实战指南。

docker7nomad的博客 838

UFS 3.1协议分析(第一至四章) -- UFS概述

Contents协议规范规范参考术语和定义简单概述通用特性接口特性功能特性 协议规范     UFS3.1协议规定了UFS电气接口和存储器件的特性以及系统架构。 特性:低功耗、高数据吞吐量、低电磁干扰、大容量存储器子系统效率的优化 电气接口:使用基于MIPI M-PHY的高级差分接口;M-PHY作为物理层,MIPI UniPro作为链路层,二者结合形成UFS接口的互联。 架构模型:参考 INCITS T10(SCSI) SAM 标准,命令协议基于 INCITS T1

Frank_sample的专栏 1万+

代码中如何干掉太多的if else即if else的多种替代方案以提高代码质量通过公司代码审查

if...else控制语句,如果代码里滥用会大大降低代码的可读性、可维护性、可扩展性以及灵活性,进而使整个软件系统造成危害。因为在实际的项目中,需求往往是不断变化的,新需求也层出不穷,因此违反了违反单一职责原则和开闭原则,而且有些公司的代码审查会通不过。所以,if else的替代方案是很有必要的,如位语句,枚举,工厂模式,策略模式,状态模式等等

qq_41889508的博客 5万+

医疗影像分割 | 使用MedSAM训练自己的医学图像分割数据集

摘要 本文详细介绍了使用MedSAM模型训练自定义医学图像数据集的完整流程。主要内容包括:代码下载与环境配置(创建虚拟环境、安装依赖、验证CUDA)、数据集准备(目录结构、格式要求、命名规范及检查工具)、预训练模型下载(不同模型选择建议),以及训练脚本修改(解决文件名匹配、Windows系统NCCL支持、单GPU训练等常见问题)。通过逐步指导,帮助用户快速搭建MedSAM训练环境并适配自己的医学图像数据,实现高效的分割模型训练。

LiRongLu_的博客 483

Java 23 种设计模式:从踩坑到精通 | 单例模式 —— 你写的真的安全吗?(12种写法全揭秘)

你写的单例真的线程安全吗?本文一口气拆解 **12 种** 实现方式——从饿汉式到枚举,从 DCL 到 CAS,附反射/序列化/克隆攻击防御测试。结合 Spring、JDK 及 AI 时代新场景,帮你彻底掌握单例的正确选型与安全防御。读完本文,你将拥有一份可以应对面试与生产环境的单例“兵器谱”。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1642

自动化上位机开发C#100例:如何用面向对象的方式封装雷赛运动控制卡EtherCAT总线卡(C#代码)

自动化上位机开发C#100例:雷赛运动控制卡EtherCAT总线卡C#封装类。

十多年IT经验,专注机器视觉,智能制造半导体行业 5017

YOLOv8改进,YOLOv8添加DCNv4可变性卷积(windows系统成功编译),全网最详细教程

DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以最小化冗余操作,从而加速计算。这些改进使得DCNv4相比DCNv3显著加快了收敛速度,并且处理速度大幅提升,前向传播速度超过三倍。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 6459

设计模式(2)——工厂方法模式详解

本文通过咖啡店点餐系统案例,系统介绍了从普通方法到工厂方法模式的演进过程。首先采用普通方法实现点餐功能,但存在耦合度高、扩展性差的问题;随后引入简单工厂模式,通过创建咖啡工厂类解耦咖啡店与具体咖啡类,但仍需修改工厂代码;最后采用工厂方法模式,定义抽象工厂接口和具体工厂实现,实现完全解耦,新增咖啡品种只需扩展而不修改原有代码,符合开闭原则。文章详细展示了三种实现方式的代码示例,分析了各自的优缺点,其中工厂方法模式虽然增加了系统复杂度,但提供了最佳的扩展性和维护性。

m0_70325779的博客 1570

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java-抽象工厂模式+工厂方法模式+策略模式简单应用实战(登录场景)

前言 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。 策略模式是oop中最著名的设计模式之一,是对方法行为的抽象,可以归类为行为设计模式,也是oop中interface经典的应用。其特点简单又实用,是我最喜欢的模式之一。策略模式定义了一个拥有共同行为的算法族,每个算法都被封装起来,可以

qq_40083897的博客 3078

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java工厂模式深度解析:从简单工厂到抽象工厂的实战应用

在软件工程中,设计模式是解决常见问题的可复用方案,其中创建型模式专注于对象实例化过程。工厂模式作为核心创建型模式,其原理是通过封装对象创建逻辑,将对象的构造与使用分离,从而降低代码耦合度。这一技术价值在于提升系统的可维护性和扩展性,尤其在需要根据运行时条件动态创建对象、管理复杂对象生命周期或确保产品族一致性的场景中作用显著。例如,在支付系统、UI主题库或数据库访问层等实际应用中,工厂模式能有效应对需求变更。本文聚焦Java工厂模式的三种形态——简单工厂、工厂方法和抽象工厂,通过支付系统等具体案例,深入剖析其

weixin_33970449的博客 381

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java 23种设计模式系列之——实战工厂方法模式

设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: 前言 好看的代码千篇一律,恶心的程序升职加薪。 该

Java0258的博客 466

Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

Java面试专题课解决面试过程中的一些常见问题,课程全面覆盖重难点Java面试题。包含了多个模块的面试题讲解,如:Redis、MySQL、框架、微服务、消息中间件、数据结构、Java集合源码分析、多线程、JVM、设计模式、高并发场景、企业实际问题场景等等各个方面逐一讲解。

我亦无他,唯手熟尔 1151

【代码整洁术】再见,if-else!你好,Spring Boot 工厂模式

在 Spring Boot 中,这种模式与依赖注入和组件化思想完美融合,能够创建出灵活、可扩展且松散耦合的代码,把你的对象创建过程变成一个优雅的艺术品。这是一种创建型设计模式,它提供了一种封装对象创建过程的方式,将实例化的具体逻辑与客户端代码解耦,从而让你在不修改客户端代码的情况下,轻松替换或增加新的产品实现。当需要增加一个新的产品类型时,你只需要创建一个新的实现类,并在工厂中增加一个分支(简单工厂)或创建一个新的工厂子类(工厂方法),对现有客户端代码毫无影响。本身就是一个巨大的、终极的工厂。

郑龙飞 1248

瑞_23种设计模式_策略模式

本文章为瑞_系列专栏之《23种设计模式》的策略模式篇。工厂模式结合策略模式可以替换 if-else 语句。策略模式主要目的是避免使用多重条件语句,并将算法的实现从使用算法的客户端代码中分离出来。在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2989

设计模式:再谈工厂模式

说到工厂模式我们一定算是比较大众常见的设计模式,基本是张嘴就来:简单工厂模式,工厂模式,抽象工厂模式。 但是问一下设计模式在构建型设计模式算几个,这三个模式什么样,怎么使用,区别?还有就是分几类?这些清楚吗。所以这边一点点来看工厂模式。 设计模式在构建型设计模式算几个? 我们说常见的资料设计模式23种,但是也有一说是22种,这到底是多少。 23种能数全的一般都是老资料,因为新的说法只有工厂模式和抽象工厂模式,少了个简单工厂自然就23-1变成22了。这里有一个国外的设计模式的学习网站可以研究看一下,内容算是比

FeiChangWuRao的博客 232

设计模式:工厂模式实战——传统方式实现抽奖系统设计(上)

工厂模式是Java常用的创建型设计模式,主要包括简单工厂、工厂方法和抽象工厂三种类型。本文通过电商促销业务场景示例,演示了不使用设计模式的传统实现方式:定义了打折券、会员和小礼品三类奖品实体,对应实现各自的服务类,在控制层使用if-else条件判断分发不同奖品类型。虽然能快速满足需求,但存在扩展性差、代码耦合等问题。后续将介绍如何运用工厂模式优化该实现,提高代码的可维护性和扩展性。

weixin_47088026的博客 961

java23种设计模式个人整理_Java 23种设计模式系列之——实战工厂方法模式

设计模式的分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。其实还有两类:并发型模式和线程池模...

weixin_39643865的博客 102

干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合

写给被成堆 if-else 折磨的后端同学:拆开工厂模式和策略模式,搞懂创建与选择的解耦,配合 Spring 实战消灭分支地狱。

大家好,我是一名大三学生,主攻 Java 后端开发。熟悉 Spring 全家桶、MySQL、Redis 以及微服务常用中间件。热爱数据结构与算法,经常在 GitHub 上分享开源项目,也在 CSDN 记录自己的学习过程。欢迎关注我,一起交流 263

Java工厂方法模式实战:从if-else困局到开闭原则

在软件开发中,如何优雅地处理对象创建是设计模式研究的核心课题。面对频繁变化的产品类型,直接使用new关键字会导致高层模块与具体实现高度耦合,代码难以扩展和维护。创建型设计模式通过引入抽象层,将对象的实例化过程与客户端代码解耦,其中工厂方法模式便是典型代表。它主张将创建逻辑下沉至子类,让系统在新增产品时无需修改已有代码,完美契合开闭原则。该模式在日志记录、支付对接、消息推送等需要多实现自由切换的场景中应用十分广泛。本文以Java语言为载体,从最原始的if-else创建逻辑出发,逐步剖析简单工厂的局限,进而完整

weixin_33178839的博客 207

【Java 23种设计模式实战】

本文通过电商订单系统实战讲解Java 23种设计模式,告别传统"Hello World"式教学。文章首先指出常见代码问题(如违反开闭原则、单一职责),然后分类详解创建型(单例、工厂等)、行为型(策略、观察者等)、结构型(代理、装饰器等)模式在订单系统中的应用场景,每个模式都配有可运行的业务代码示例。特别强调模式解决的实际问题(如订单审批流使用责任链模式、支付方式切换使用策略模式),并对比不同实现方式的优缺点(如5种单例模式实现)。最后提供设计原则对照、易混淆模式对比及Spring框架中的设计模式应用。

weixin_50870268的博客 557

专项攻克——工厂模式

文章目录什么是工厂设计模式?简单工厂设计模式工厂方法设计模式抽象工厂设计模式(例子1)三种工厂方式总结1(总结的非常好)1、简单工厂模式2、工厂方法模式3、抽象工厂模式三种工厂方式总结2: 参考文献 什么是工厂设计模式? 工厂设计模式:用来生产对象的。 背景:java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都...

军威兄的博客 307

Java 23 种设计模式

/ 产品族:Button + TextField 是一套// Windows 风格} }} }// Mac 风格} }} }// 抽象工厂 — 创建产品族一句话:普通工厂一个方法一种产品,抽象工厂一个方法多个关联产品。// 计算 "1 + 2 - 3"right = r;// 使用// 3一句话:很少用,JDK 的就是。创建型 — 怎么 new单例(一个)→ 工厂(子类决定)→ 抽象工厂(产品族)→ 建造者(分步构造)→ 原型(克隆)结构型 — 类/对象怎么组合。

鲜衣怒马少年时,不负韶华行且知。 从第一个Hello World起,便踏上这条后端修行路。趟过分布式事务的浑水,翻过性能瓶颈的高山,方知代码如剑,需千锤百炼方显锋芒。 博客所记,皆为修行路上的顿悟与磕绊,愿与同道人共勉,稳步江湖。 308
上一篇: 《Java 100 天进阶之路》第38篇:Java是动态语言吗?
下一篇: 腾讯AI编程神器CodeBuddy:多环境安装到项目实战完整攻略
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值