设计模式-单例模式(一)

2023-05-03 15:19:33 浏览数 (1)

单例模式是一种创建型设计模式,它能够保证一个类仅有一个实例,并提供一个全局访问点。单例模式可以在需要控制资源的情况下,如线程池、数据库连接池等,确保系统中只有一个实例存在,避免了资源浪费和多个实例之间的冲突。

单例模式有多种实现方式,其中最常用的方式是饿汉式和懒汉式。在饿汉式中,单例对象在类加载时就被创建,因此具有线程安全性,但可能会浪费一定的系统资源。在懒汉式中,单例对象在第一次被访问时才被创建,因此具有较好的懒加载效果,但需要注意线程安全性问题。

下面我们通过一个示例代码来演示单例模式的实现。

饿汉式实现

在饿汉式中,单例对象在类加载时就被创建,因此具有线程安全性。我们可以通过在类中定义一个静态的、final 的私有成员变量来实现单例模式。

代码语言:javascript复制
public class Singleton {
    // 定义一个私有的、静态的、final 的单例对象
    private static final Singleton instance = new Singleton();
    
    // 将构造方法私有化,防止外部创建对象
    private Singleton() {}
    
    // 提供一个全局访问点
    public static Singleton getInstance() {
        return instance;
    }
}

在这个示例中,我们将构造方法私有化,防止外部创建对象。通过定义一个静态的、final 的私有成员变量,实现了单例模式,并通过提供一个全局访问点 getInstance() 方法来获取单例对象。

懒汉式实现

在懒汉式中,单例对象在第一次被访问时才被创建。需要注意的是,在多线程环境下,可能会存在线程安全问题。因此,在实现懒汉式单例模式时,需要考虑线程安全性问题。

以下是懒汉式单例模式的一种线程安全的实现方式。

代码语言:javascript复制
public class Singleton {
    // 定义一个私有的单例对象
    private static Singleton instance;
    
    // 将构造方法私有化,防止外部创建对象
    private Singleton() {}
    
    // 提供一个全局访问点,使用 synchronized 关键字实现线程安全
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在这个示例中,我们将构造方法私有化,防止外部创建对象。通过定义一个静态的、私有成员变量 instance,在第一次访问时判断对象是否为 null,如果是则创建新的对象,否则返回现有的对象。为了保证线程安全性,在 getInstance() 方法上加上 synchronized 关键字,保证在多线程环境下只有一个线程能够访问该方法。

0 人点赞