当前位置: 首页 > news >正文

【设计模式】3W 学习法深入剖析创建型模式:原理、实战与开源框架应用(含 Java 代码)

3W 学习法总结创建型模式(附 Java 代码实战及开源框架应用)

创建型模式主要关注 对象的创建,旨在提高代码的可复用性、可扩展性和灵活性。本文采用 3W 学习法(What、Why、How),深入分析 五大创建型模式:单例、工厂方法、抽象工厂、建造者和原型模式,并结合 Java 代码实战开源框架中的应用,帮助你高效掌握创建型模式。


1. 单例模式(Singleton)

✅ What:单例模式是什么?

单例模式 确保一个类只有一个实例,并提供一个全局访问点。它常用于 共享资源管理、线程池、日志管理 等场景。

🤔 Why:为什么要使用单例模式?

  • 节省资源:避免创建多个实例,减少内存占用。
  • 全局访问:提供唯一实例,适用于缓存、配置管理等。
  • 控制实例化:防止重复创建对象,提升系统性能。

🚀 How:如何实现单例模式?(Java 代码实战)

双重检查锁实现线程安全单例

public class Singleton {
    private static volatile Singleton instance;
    
    private Singleton() {} // 私有构造函数

    public static Singleton getInstance() {
        if (instance == null) { 
            synchronized (Singleton.class) {
                if (instance == null) { 
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

📌 在开源框架中的应用:

  • Spring 的 Bean 作用域:默认情况下,Spring Bean 是单例模式 (@Scope("singleton"))。
  • Runtime.getRuntime():Java 的 Runtime 类是单例模式的典型应用。

2. 工厂方法模式(Factory Method)

✅ What:工厂方法模式是什么?

工厂方法模式 通过 定义一个抽象工厂接口,让子类决定实例化哪个类,从而实现 面向接口编程

🤔 Why:为什么要使用工厂方法?

  • 解耦:调用者无需关心具体实现,依赖抽象工厂。
  • 符合开闭原则:新增产品无需修改原工厂,只需创建新的子类工厂。

🚀 How:如何实现工厂方法?(Java 代码实战)

// 抽象产品
interface Product {
    void use();
}

// 具体产品A
class ProductA implements Product {
    public void use() { System.out.println("使用产品A"); }
}

// 抽象工厂
interface Factory {
    Product createProduct();
}

// 具体工厂A
class FactoryA implements Factory {
    public Product createProduct() { return new ProductA(); }
}

// 客户端调用
public class FactoryMethodDemo {
    public static void main(String[] args) {
        Factory factory = new FactoryA();
        Product product = factory.createProduct();
        product.use(); // 输出: 使用产品A
    }
}

📌 在开源框架中的应用:

  • Spring BeanFactory:Spring 通过 BeanFactory 采用工厂方法模式管理 Bean 的创建。
  • JDBC 驱动加载DriverManager.getConnection() 通过工厂方法获取不同数据库驱动。

3. 抽象工厂模式(Abstract Factory)

✅ What:抽象工厂模式是什么?

抽象工厂模式 提供一个 接口,用于创建 一系列相关或相互依赖的对象,而无需指定其具体类。

🤔 Why:为什么要使用抽象工厂?

  • 产品族管理:能创建 一整套相关产品,适用于 GUI 组件、数据库连接等场景。
  • 保证产品兼容性:不同产品族之间不会互相影响。

🚀 How:如何实现抽象工厂模式?(Java 代码实战)

// 抽象产品A
interface Button { void click(); }

// 具体产品A1
class MacButton implements Button {
    public void click() { System.out.println("Mac 按钮点击"); }
}

// 抽象工厂
interface GUIFactory {
    Button createButton();
}

// 具体工厂:Mac 工厂
class MacFactory implements GUIFactory {
    public Button createButton() { return new MacButton(); }
}

// 客户端调用
public class AbstractFactoryDemo {
    public static void main(String[] args) {
        GUIFactory factory = new MacFactory();
        Button button = factory.createButton();
        button.click(); // 输出: Mac 按钮点击
    }
}

📌 在开源框架中的应用:

  • Spring ApplicationContext:Spring 使用 ApplicationContext 作为抽象工厂,创建和管理 Bean。
  • 数据库连接池:如 javax.sql.DataSource 负责创建数据库连接对象。

4. 建造者模式(Builder)

✅ What:建造者模式是什么?

建造者模式 通过 一步步构建复杂对象,并支持 链式调用,适用于 对象参数较多的场景

🤔 Why:为什么要使用建造者模式?

  • 解决构造函数参数过多的问题,避免冗长的构造函数。
  • 链式调用 使代码更简洁,提高可读性。

🚀 How:如何实现建造者模式?(Java 代码实战)

class Computer {
    private String CPU;
    private int RAM;

    public static class Builder {
        private String CPU;
        private int RAM;

        public Builder setCPU(String CPU) { this.CPU = CPU; return this; }
        public Builder setRAM(int RAM) { this.RAM = RAM; return this; }
        public Computer build() { return new Computer(this); }
    }

    private Computer(Builder builder) {
        this.CPU = builder.CPU;
        this.RAM = builder.RAM;
    }
}

// 客户端调用
public class BuilderDemo {
    public static void main(String[] args) {
        Computer computer = new Computer.Builder()
            .setCPU("Intel i9")
            .setRAM(32)
            .build();
        System.out.println("电脑构造完成");
    }
}

📌 在开源框架中的应用:

  • Lombok @Builder 注解:简化 Java 对象构造。
  • StringBuilderStringBuilder.append() 采用建造者模式。

5. 原型模式(Prototype)

✅ What:原型模式是什么?

原型模式 通过 克隆现有对象 来创建新对象,而不是直接实例化。

🤔 Why:为什么要使用原型模式?

  • 提高性能:避免重复创建对象,适用于对象初始化成本高的场景。
  • 避免复杂构造:直接复制已有对象,减少对象创建的复杂度。

🚀 How:如何实现原型模式?(Java 代码实战)

class Prototype implements Cloneable {
    String name;

    public Prototype(String name) { this.name = name; }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

// 客户端调用
public class PrototypeDemo {
    public static void main(String[] args) throws CloneNotSupportedException {
        Prototype p1 = new Prototype("原型对象");
        Prototype p2 = (Prototype) p1.clone();
        System.out.println("克隆成功: " + p2.name);
    }
}

📌 在开源框架中的应用:

  • Spring Bean 作用域 @Scope("prototype"):每次获取 Bean 时都会克隆新实例。
  • java.lang.Object#clone():标准 Java 克隆机制。

总结

设计模式主要作用适用场景
单例模式保证唯一实例日志管理、数据库连接池
工厂方法解耦对象创建JDBC、Spring BeanFactory
抽象工厂创建产品族GUI 组件、数据库连接
建造者复杂对象构建Lombok @Builder、StringBuilder
原型模式克隆对象Spring @Scope("prototype")

这五种创建型模式各有特点,结合实际项目,能让代码更加灵活、可维护! 🚀

相关文章:

  • 条款43:学习处理模板化基类内的名称
  • 提示deepseek生成完整的json用于对接外部API
  • 【Film】MovieAgent:自动化电影生成通过多智能体CoT规划
  • Linux上的`i2c-tools`工具集的详细介绍;并利用它操作IMX6ULL的I2C控制器进而控制芯片AP3216C读取光照值和距离值
  • 深度学习框架PyTorch——从入门到精通(1)下载与安装
  • flutter 专题 一百零三
  • MySQL如何存储表情符号?
  • LeetCode 第14~16题
  • 【gopher的java学习笔记】如何知道java应用启动过程中加载了哪些class
  • 【2025 最新 Cursor AI 教程 06】Cursor AI 与其他 AI 编码助手的比较
  • vue render函数开发高阶组件(HOC)
  • 卷积神经网络 - 卷积的变种、数学性质
  • 【多线程-第四天-SDWebImage介绍-复习前一天的内容 Objective-C语言】
  • 前端使用 crypto-js库AES加解密
  • 2024 年河南省职业院校 技能大赛高职组 “大数据分析与应用” 赛项任务书(一)
  • C语言中,#define和typedef 定义int* 一个容易混淆的点
  • 2025最新!人工智能领域大模型学习路径、大模型使用、AI工作流学习路径
  • 前端小食堂 | Day17 - 前端安全の金钟罩
  • 【深度学习量化交易16】触发机制设置——基于miniQMT的量化交易回测系统开发实记
  • 深度剖析Java开发中的双写一致性问题:原理、挑战与实战解决方案
  • 遭车祸罹难的村医遇“身份”难题:镇卫生院否认劳动关系,家属上诉后二审将开庭
  • 英国6月初将公布对华关系的审计报告,外交部:望英方树立正确政策导向
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • 跨越三十年友情,61岁余隆和60岁齐默尔曼在上海再度合作
  • 银行积分大幅贬值遭质疑,涉及工行、中行、农行等
  • 九江宜春领导干部任前公示,3人拟提名为县(市、区)长候选人