目录
简介
常用方法
简介:
单例设计模式是一种创建对象的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点来获取该实例。
在单例设计模式中,类通过以下方式实现只有一个实例:
-
私有构造方法(Private Constructor):为了防止类被其他类直接实例化,单例类通常将构造方法声明为私有的,使得其他类无法通过构造方法创建该类的实例。
-
静态成员变量(Static Member Variable):单例类内部通常会声明一个私有的静态成员变量,用于存储单例对象的实例。
-
静态获取方法(Static Get Method):单例类会提供一个公共的静态方法,允许其他类通过该方法获取单例对象的实例。该方法会先判断静态成员变量是否已经被实例化,如果是,则直接返回该实例;如果否,则创建一个新的实例并赋值给静态成员变量,然后返回该实例。
通过以上的方式,单例设计模式保证了一个类只有一个实例,并提供了一个全局访问点来获取该实例。这样可以避免多个实例的创建,节省系统资源,并且在需要共享对象时,提供了一种方便的访问方式。
需要注意的是,单例模式在多线程环境下需要考虑线程安全性,可以通过加锁等方式来保证线程安全性。
总结起来,单例设计模式通过私有构造方法、静态成员变量和静态获取方法,保证一个类只有一个实例,并提供了全局访问点来获取该实例。它可以用于需要共享对象、避免重复创建对象等场景。
常用方法:
- 饿汉式(Eager Initialization): 在这种方法中,单例实例在类加载时就被创建,因此它是线程安全的。可以通过私有静态成员变量直接实例化单例对象,并提供一个公共的静态获取方法来获取该实例。例如:
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() { // 私有构造方法 } public static Singleton getInstance() { return instance; } }
- 懒汉式(Lazy Initialization): 在这种方法中,单例实例在首次被使用时才被创建,也称为延迟加载。需要注意的是,懒汉式的实现在多线程环境下可能存在线程安全性问题,需要进行同步处理。以下是一种简单的线程安全的懒汉式实现:
public class Singleton { 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; } }
在上述代码中,使用了双重检查锁定(Double-Checked Locking)的方式来保证线程安全性。
3. 静态内部类(Static Inner Class): 这种方法利用了类加载的特性,通过静态内部类来延迟加载单例实例。静态内部类在首次被使用时才会加载,且加载类的过程是线程安全的。以下是静态内部类实现的示例:
public class Singleton {
private Singleton() {
// 私有构造方法
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
通过上述三种常用的方法,可以实现单例设计模式并确保在应用程序中只有一个实例被创建。选择适合的方法取决于具体的需求和场景,需要综合考虑线程安全性、延迟加载等因素。