设计模式(一)
单例模式(Singleton Pattern)
1. 概念
单例模式的核心目标是确保一个类只有一个实例,并提供一个全局访问点。这意味着无论何时何地,你都可以访问到同一个对象实例。
2. 单例模式的特点
- 唯一性: 只允许一个实例存在。
- 延迟初始化: 实例在第一次使用时创建,而不是在程序启动时创建,节省资源。
- 全局访问: 通过一个全局方法来获取唯一的实例,通常是静态方法。
3. 实现方式
在不同的编程语言中,单例模式的实现可能略有不同。下面是C#和Java中的实现示例。
C#实现
public class Singleton
{
private static Singleton _instance;
// 私有构造函数,防止外部实例化
private Singleton() { }
// 公共静态方法,提供全局访问点
public static Singleton Instance
{
get
{
if (_instance == null)
{
_instance = new Singleton();
}
return _instance;
}
}
public void DoSomething()
{
Console.WriteLine("Singleton instance is working.");
}
}
访问实例: Singleton.Instance.DoSomething();
Java实现
public class Singleton {
private static Singleton instance;
// 私有构造函数,防止外部实例化
private Singleton() { }
// 公共静态方法,提供全局访问点
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
public void doSomething() {
System.out.println("Singleton instance is working.");
}
}
访问实例: Singleton.getInstance().doSomething();
4. 线程安全的单例模式
在多线程环境中,如果多个线程同时调用获取实例的方法,可能会创建多个实例。为了解决这个问题,我们需要在单例模式中加入线程安全的机制。
C# 中的线程安全单例
使用双重检查锁定(Double-Checked Locking)来确保线程安全:
public class Singleton
{
private static Singleton _instance;
private static readonly object _lock = new object();
private Singleton() { }
public static Singleton Instance
{
get
{
if (_instance == null)
{
lock (_lock)
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
}
Java 中的线程安全单例
可以使用volatile
关键字和双重检查锁定来实现:
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;
}
}
5. 优点
- 内存效率: 单例模式只创建一个实例,节省内存。
- 全局访问: 提供全局访问点,方便管理和控制全局资源。
6. 缺点
- 不易测试: 因为单例类紧耦合于它的唯一实例,可能导致单元测试困难。
- 隐藏的依赖: 单例模式的全局访问点可能使得依赖关系不明显,增加代码复杂性。
7. 适用场景
- 资源管理: 如线程池、数据库连接池等,需要全局唯一实例来管理资源。
- 配置管理: 应用程序配置通常需要全局访问,并且在整个生命周期中只存在一个配置实例。
小结
掌握了单例模式的基本原理和实现,可以尝试在实际项目中应用它,或者探索如何将其与其他设计模式组合使用。