在Java开发中,设计模式是解决特定问题的经典方案。本文将深入探讨单例模式和工厂模式,这两种最常用且强大的设计模式。我们将从基础概念讲起,逐步深入到实际应用场景和高级技巧。
一、单例模式:确保全局唯一实例
单例模式(Singleton Pattern)确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要控制资源访问、配置管理或线程池等场景中特别有用。
1.1 基本实现方式
最简单的单例实现是饿汉式:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
这种实现简单直接,但可能在程序启动时就创建实例,即使从未使用。
1.2 线程安全的懒汉式
更优雅的实现是双重检查锁定的懒汉式:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
这种实现既保证了线程安全,又实现了延迟加载。
1.3 枚举实现 - 最佳实践
Joshua Bloch在《Effective Java》中推荐使用枚举实现单例:
public enum Singleton {
INSTANCE;
public void doSomething() {
// 业务方法
}
}
这种方式不仅能避免多线程同步问题,还能防止反序列化重新创建新对象。
二、工厂模式:对象创建的优雅解决方案
工厂模式(Factory Pattern)定义了一个创建对象的接口,但让子类决定实例化哪个类。工厂方法让类的实例化延迟到子类。
2.1 简单工厂模式
最简单的工厂模式实现:
public class ShapeFactory {
public Shape createShape(String type) {
if (type.equalsIgnoreCase("circle")) {
return new Circle();
} else if (type.equalsIgnoreCase("rectangle")) {
return new Rectangle();
}
return null;
}
}
2.2 工厂方法模式
更灵活的方式是工厂方法模式:
public interface ShapeFactory {
Shape createShape();
}
public class CircleFactory implements ShapeFactory {
public Shape createShape() {
return new Circle();
}
}
public class RectangleFactory implements ShapeFactory {
public Shape createShape() {
return new Rectangle();
}
}
2.3 抽象工厂模式
当需要创建一系列相关或依赖对象时,抽象工厂模式更合适:
public interface GUIFactory {
Button createButton();
Checkbox createCheckbox();
}
public class WinFactory implements GUIFactory {
public Button createButton() {
return new WinButton();
}
public Checkbox createCheckbox() {
return new WinCheckbox();
}
}
三、实际应用场景对比
3.1 单例模式适用场景
- 配置管理类
- 线程池
- 缓存系统
- 日志记录器
- 设备驱动程序
3.2 工厂模式适用场景
- 需要创建复杂对象
- 需要根据配置创建不同对象
- 需要解耦对象的创建与使用
- 需要为不同环境提供不同实现
四、性能考量与最佳实践
4.1 单例模式注意事项
- 避免过度使用单例,它本质上是全局状态
- 考虑线程安全问题
- 注意序列化和反序列化问题
- 在依赖注入框架中谨慎使用
4.2 工厂模式优化技巧
- 结合反射机制实现更灵活的工厂
- 使用缓存提高性能
- 考虑使用依赖注入框架替代手动工厂
- 为工厂添加生命周期管理
五、现代Java中的演进
在Java 8+和Spring等现代框架中,这些模式有了新的实现方式:
5.1 使用Supplier实现延迟初始化
public class LazySingleton {
private static final Supplier<Singleton> INSTANCE =
() -> {
Singleton instance = new Singleton();
return instance;
};
public static Singleton getInstance() {
return INSTANCE.get();
}
}
5.2 Spring中的单例与工厂
Spring框架本身就实现了单例模式,同时提供了强大的工厂机制:
@Configuration
public class AppConfig {
@Bean
@Scope("singleton")
public MyService myService() {
return new MyServiceImpl();
}
}
六、总结
单例模式和工厂模式是Java设计模式中最基础也最强大的两种模式。正确理解和使用它们可以显著提高代码质量。单例模式确保全局唯一访问点,而工厂模式提供了灵活的对象创建机制。在实际开发中,应根据具体需求选择最合适的实现方式,并注意避免常见陷阱。
随着Java语言的演进和框架的发展,这些经典模式的实现方式也在不断优化。掌握它们的核心思想比记住具体实现更重要,这样才能在复杂多变的开发环境中灵活应用。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。