Java设计模式深度解析:创建型模式实战指南

设计模式是软件工程中解决常见问题的可复用方案,本文将重点解析Java中的创建型模式,包括其核心实现、应用场景及最佳实践。

一、单例模式:全局唯一实例的优雅实现

线程安全实现方案

public class Singleton {
    // volatile保证可见性和有序性
    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;
    }
}

破坏与防御机制

  • 反射攻击防御:在构造器中添加已存在实例检查
  • 序列化攻击防御:实现readResolve()方法返回单例实例
private Singleton() {
    if (instance != null) {
        throw new IllegalStateException("单例实例已存在");
    }
}

protected Object readResolve() {
    return getInstance();
}

实践建议

  • 优先使用枚举实现单例(Java 5+)
  • Spring默认单例是Bean作用域而非设计模式实现
  • 考虑使用依赖注入框架管理单例生命周期

二、工厂方法模式:灵活的对象创建

多态工厂实现

interface Logger {
    void log(String message);
}

class FileLogger implements Logger { /*...*/ }
class DatabaseLogger implements Logger { /*...*/ }

interface LoggerFactory {
    Logger createLogger();
}

class FileLoggerFactory implements LoggerFactory {
    public Logger createLogger() {
        return new FileLogger();
    }
}

IoC容器基础原理
Spring框架通过BeanFactoryApplicationContext将工厂模式提升到容器级别:

图1

实践建议

  • 工厂方法适合创建逻辑复杂的对象
  • 结合泛型减少工厂类数量
  • 考虑使用静态工厂方法简化实现

三、抽象工厂模式:产品族扩展方案

interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

class WinFactory implements GUIFactory { /*...*/ }
class MacFactory implements GUIFactory { /*...*/ }

产品族扩展

  • 新增产品族(如Linux风格)只需实现新工厂类
  • 新增产品类型(如RadioButton)需修改所有工厂接口

实践建议

  • 适合存在多个产品等级结构的场景
  • 与原型模式结合可动态配置产品族
  • 避免过度设计,产品族稳定时才适用

四、建造者模式:复杂对象分步构建

链式调用实现

class Computer {
    private String cpu;
    private String ram;
    // ...
    
    static class Builder {
        private Computer computer = new Computer();
        
        Builder withCpu(String cpu) {
            computer.cpu = cpu;
            return this;
        }
        
        Computer build() {
            validate(computer);
            return computer;
        }
    }
}

// 使用
Computer pc = new Computer.Builder()
    .withCpu("Intel")
    .withRam("16GB")
    .build();

与工厂模式对比

特性建造者模式工厂模式
构建过程分步构建一步构建
产品复杂度复杂对象标准对象
适用场景参数组合多变固定创建逻辑

实践建议

  • 适合参数超过4个且可选参数多的场景
  • 使用Lombok的@Builder简化实现
  • 考虑将Builder作为内部类增强封装性

五、原型模式:高效对象复制

深拷贝实现方案

class Prototype implements Cloneable {
    private List<String> items;
    
    @Override
    public Prototype clone() {
        Prototype copy = (Prototype)super.clone();
        copy.items = new ArrayList<>(this.items); // 深拷贝集合
        return copy;
    }
}

浅拷贝与深拷贝对比

  • 浅拷贝:Object.clone()默认实现,复制基本类型和引用地址
  • 深拷贝:递归复制引用对象,可通过序列化/反序列化实现

实践建议

  • 优先使用拷贝构造器或静态工厂方法
  • 复杂对象深拷贝考虑使用Apache Commons或JSON序列化
  • 原型注册表模式可管理常用原型实例

创建型模式选型指南

图2

性能考量

  • 原型模式适合创建成本高的对象
  • 简单对象直接实例化性能最佳
  • 工厂方法会增加一定的方法调用开销

掌握这些创建型模式,能够使你的Java代码更加灵活、可维护且高效。在实际项目中,往往需要根据具体场景组合使用多种模式。

添加新评论