Singleton 单件(创建型模式)

preview
共1个文件
wmv:1个
需积分: 0 2 下载量 25 浏览量 更新于2008-04-16 收藏 8.19MB RAR 举报
**Singleton 模式详解** Singleton 是一种在软件工程中广泛使用的创建型设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要频繁实例化然后销毁的对象,或者当实例化一个对象需要消耗大量资源时,如数据库连接、线程池、配置对象等。 Singleton 的核心思想是限制类的实例化过程,使得类的实例只能通过特定的方式(通常是静态方法)获取,从而保证了全局范围内只有一个实例存在。在Java中,通常我们采用懒汉式和饿汉式两种方式实现 Singleton。 1. **懒汉式 Singleton**:延迟初始化,只有在第一次调用 getInstance 方法时才创建实例。这种方式线程不安全,如果在多线程环境下可能会创建多个实例。为了解决这个问题,可以采用双重检查锁定(Double-Check Locking)机制,代码如下: ```java 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; } } ``` 2. **饿汉式 Singleton**:在类加载时就完成实例化,避免了线程同步问题,但会占用不必要的内存空间。代码如下: ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } } ``` 3. **静态内部类 Singleton**:利用 Java 类加载机制保证初始化实例时只有一个线程,同时又避免了懒汉式的同步开销。代码如下: ```java public class Singleton { private Singleton() {} private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.INSTANCE; } } ``` 4. **枚举 Singleton**:这是 Bill Pugh 提出的一种创建 Singleton 实例的方法,既能防止反序列化重新创建新的实例,又避免了同步问题。代码如下: ```java public enum Singleton { INSTANCE; public void whateverMethod() { } } ``` 5. **线程局部变量 Singleton**:适用于每个线程需要自己独立的实例,但并不保证全局唯一。这种方式在多线程环境下很有用,但不是传统的 Singleton 模式。 了解 Singleton 模式后,我们需要注意它的一些潜在问题。Singleton 可能导致系统的耦合度增加,因为它全局可访问,可能导致测试困难。此外,如果 Singleton 实例持有外部资源(如数据库连接),不正确地管理这些资源可能导致资源泄露。在某些情况下,Singleton 还可能阻碍系统扩展,因为它限制了类实例的数量。 设计模式是解决常见软件设计问题的模板,Singleton 模式是其中最基础、最常用的一种。通过深入理解并恰当运用 Singleton,我们可以提高代码的可维护性和可复用性。在实际开发中,要根据项目需求和场景选择合适的 Singleton 实现方式,以达到最佳的设计效果。
ynaigd
  • 粉丝: 2
  • 资源: 6
上传资源 快速赚钱
voice
center-task 前往需求广场,查看用户热搜

最新资源