单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供全局访问点。这种模式在需要频繁创建和销毁对象,或者对象创建代价较大,且需要全局共享资源时非常有用。下面我们将深入探讨单例模式的概念、实现方式以及其在实际编程中的应用。 一、单例模式的基本概念 单例模式的核心思想是限制类的实例化过程,确保任何时候只有一个实例存在。通过控制类的构造函数,使得外部不能直接通过new关键字创建对象,而是通过特定的方法(通常称为Singleton方法)来获取唯一的实例。 二、单例模式的实现方式 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 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; } } ``` 4. 懒汉式(线程安全 - 同步方法) 通过在getInstance()方法上加synchronized关键字,确保多线程环境下实例化的唯一性。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public synchronized static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 5. 双重检查锁定(DCL,线程安全) 在懒汉式的基础上增加了volatile关键字和双重检查,既保证了线程安全,又避免了过多的同步开销。 ```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; } } ``` 6. 静态内部类 利用Java类加载机制保证单例的唯一性,同时延迟实例化,线程安全。 ```java public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 三、单例模式的应用场景 1. 控制资源的访问:如数据库连接池、缓存、日志对象等。 2. 当一个类只能有一个实例,并且客户可以从一个众所周知的访问点访问它时。 3. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 四、单例模式的优缺点 优点: 1. 单例模式可以保证系统内存中该类只存在一个对象,节省了系统资源。 2. 对于频繁使用的对象,可以省去创建和销毁对象所花费的时间,提高性能。 3. 单例模式可以全局访问。 缺点: 1. 单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有第二种途径,违背“开闭原则”。 2. 在并发测试时,单例模式会带来一些问题,难以进行并行测试。 3. 单例模式对测试是不利的,因为测试一般需要构造多个环境,而单例则只能提供一个。 五、单例模式的变种和扩展 1. 寄生式单例:将单例实例化过程封装在一个普通对象中,通过该对象来获取单例实例。 2. 懒汉枚举:结合枚举和单例模式,保证线程安全和防止反序列化创建新实例。 单例模式是一种常用的软件设计模式,它在特定场景下能有效优化系统资源的使用和提高代码的可维护性。然而,使用时需谨慎,避免滥用导致代码的复杂性和扩展性降低。在实际编程中,应根据具体需求选择合适的设计模式。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- asm-西电微机原理实验
- Arduino-arduino
- C语言-leetcode题解之70-climbing-stairs.c
- C语言-leetcode题解之68-text-justification.c
- C语言-leetcode题解之66-plus-one.c
- C语言-leetcode题解之64-minimum-path-sum.c
- C语言-leetcode题解之63-unique-paths-ii.c
- C语言-leetcode题解之62-unique-paths.c
- C语言-leetcode题解之61-rotate-list.c
- C语言-leetcode题解之59-spiral-matrix-ii.c