单例模式的8种写法

单例模式的8种写法


2024年1月13日发(作者:)

单例模式的8种写法

单例模式是一种常用的设计模式,在软件开发中经常被使用。它的主要目的是确保一个类只有一个实例,并且提供一个全局访问点。

在实际应用中,单例模式的使用非常广泛。比如,在某个系统中,只允许创建一个日志文件、数据库连接池等。这些场景下,单例模式可以确保只有一个实例存在,避免资源的浪费和冲突。

单例模式的实现方式有多种,下面将详细介绍8种常见的实现方法。

1. 饿汉式(直接初始化):

java

public class Singleton {

private static final Singleton INSTANCE = new Singleton();

private Singleton() {}

public static Singleton getInstance() {

return INSTANCE;

}

}

这种方式在类加载时就创建了一个实例,因此线程安全,但可能存在资源浪费的问题,因为即使不使用也会创建实例。

2. 饿汉式(静态代码块初始化):

java

public class Singleton {

private static final Singleton INSTANCE;

static {

INSTANCE = new Singleton();

}

private Singleton() {}

public static Singleton getInstance() {

return INSTANCE;

}

}

与第一种方式相似,只是将实例创建的过程放在了静态代码块中。

3. 懒汉式(线程不安全):

java

public class Singleton {

private static Singleton INSTANCE;

private Singleton() {}

public static Singleton getInstance() {

if (INSTANCE == null) {

INSTANCE = new Singleton();

}

return INSTANCE;

}

}

这种方式实现了懒加载,只有在第一次调用getInstance方法时才会创建实例。但是这种方式在多线程环境下是不安全的,可能会创建多个实例。

4. 懒汉式(线程安全,加锁):

java

public class Singleton {

private static Singleton INSTANCE;

private Singleton() {}

public static synchronized Singleton getInstance() {

if (INSTANCE == null) {

INSTANCE = new Singleton();

}

return INSTANCE;

}

}

为了避免在多线程环境下创建多个实例,可以使用synchronized关键字加锁,确保只有一个线程可以创建实例。但是这种方式效率较低,每次调用getInstance方法都需要进行同步,即使实例已经创建了。

5. 懒汉式(线程安全,双重检查):

java

public class Singleton {

private static volatile Singleton INSTANCE;

private Singleton() {}

public static Singleton getInstance() {

if (INSTANCE == null) {

synchronized () {

if (INSTANCE == null) {

INSTANCE = new Singleton();

}

}

}

return INSTANCE;

}

}

通过双重检查,既保证了线程安全性,又避免了每次调用getInstance方法都进行同步的问题。关键在于使用volatile关键字修饰INSTANCE变量,禁止指令重排序,确保先分配内存、再初始化对象、最后将INSTANCE指向该对象。

6. 懒汉式(线程安全,静态内部类):

java

public class Singleton {

private Singleton() {}

private static class SingletonHolder {

private static final Singleton INSTANCE = new Singleton();

}

public static Singleton getInstance() {

return CE;

}

}

通过静态内部类来实现懒加载,当getInstance方法被调用时,才会初始化SingletonHolder类,从而创建实例。这种方式能够保证线程安全性。

7. 枚举单例:

java

public enum Singleton {

INSTANCE;

}

枚举是一种特殊的类,它的实例是有限且唯一的。枚举单例可以保证线程安全,同时也能防止反射和反序列化创建新的实例。

8. 使用容器实现单例:

java

public class SingletonManager {

private static Map objectMap = new

HashMap<>();

private SingletonManager() {}

public static void registerService(String key, Object instance) {

if (!nsKey(key)) {

(key, instance);

}

}

public static Object getService(String key) {

return (key);

}

}

通过容器管理单例,可以将多个实例存放在一个容器中,需要时通过key值获取对应的实例。这种方式可以灵活管理单例对象的创建和获取。

以上是8种常见的单例模式的实现方式,每种方式都有其适用的场景和特点。在具体开发中,根据需求和性能要求选择合适的单例模式实现方式,从而确保系统的正确性和高效性。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1705128501a1394829.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信