Java创建型设计模式实战:单例、工厂、建造者详解
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框架通过BeanFactory
和ApplicationContext
将工厂模式提升到容器级别:
实践建议:
- 工厂方法适合创建逻辑复杂的对象
- 结合泛型减少工厂类数量
- 考虑使用静态工厂方法简化实现
三、抽象工厂模式:产品族扩展方案
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序列化
- 原型注册表模式可管理常用原型实例
创建型模式选型指南
性能考量:
- 原型模式适合创建成本高的对象
- 简单对象直接实例化性能最佳
- 工厂方法会增加一定的方法调用开销
掌握这些创建型模式,能够使你的Java代码更加灵活、可维护且高效。在实际项目中,往往需要根据具体场景组合使用多种模式。