0%

设计模式-创建型模式- 单件模式

深入理解单例模式 - 创建型模式的精髓

单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供全局访问点。在许多场景中,单例模式被用于管理全局状态、资源共享以及限制对象的创建。在本文中,我们将深入探讨单例模式的概念、实现方式以及在实际应用中的使用场景。

单例模式的概念

单例模式是设计模式中最简单但也是最常用的模式之一。其核心思想是通过限制一个类只能有一个实例,确保该实例能够被全局访问。这通常通过以下几个要素来实现:

  1. 私有构造函数: 防止外部通过构造函数创建实例。
  2. 私有静态变量: 用于保存实例。
  3. 公有静态方法(全局访问点): 用于获取实例。

单例模式的实现方式

在C#中,实现单例模式的方式有多种,以下是其中两种常见的实现方式:

1. 懒汉式单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// <summary>
/// 懒汉式单例类
/// </summary>
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
public static Singleton GetInstance()
{
//双重锁定
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}

这种实现方式在需要时才创建实例,称为懒汉式。通过 lock 语句确保多线程环境下的安全创建。

2. 饿汉式单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/// <summary>
/// 懒汉式单例类
/// </summary>
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot = new object();
public static Singleton GetInstance()
{
//双重锁定
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}

这种实现方式在类加载时就创建实例,称为饿汉式。由于在类加载时就创建,因此不存在多线程安全问题。

单例模式的应用场景

单例模式适用于以下场景:

  1. 资源共享: 当应用中需要共享资源(如配置信息、日志对象)时,单例模式能够确保只有一个实例处理这些共享资源。

  2. 全局状态管理: 当某个对象需要在系统中保存全局状态时,单例模式能够提供一个统一的入口点来管理这个状态。

  3. 唯一访问点: 当某个类的实例只能有一个访问点时,如工厂类、线程池等,单例模式能够确保只有一个实例提供访问点。

单例模式的注意事项

  1. 多线程安全: 在多线程环境下,懒汉式单例模式需要考虑线程安全问题,可通过 lockdouble-check 等方式解决。

  2. 延迟加载: 懒汉式单例模式支持延迟加载,但在需要时创建实例,可能会引入性能开销。

  3. 反序列化安全: 如果单例类可能被序列化和反序列化,需要实现 ISerializable 接口并提供 OnDeserialized 方法,以确保反序列化后仍然是单例。

总结

使用Singleton 模式的意图就是要保证一个类只有一个实例,同时提供客户程序一个访问它的全局访问点。虽然经典Singleton 模式旨在控制实例的数量,但受到种种“隐性”破坏因素的威胁,我们还需要实施各种针对性的实例数量控制手段。

单例模式是一种简单而强大的设计模式,适用于多种场景。通过合理选择懒汉式或饿汉式的实现方式,可以满足不同的需求。在实际应用中,合理使用单例模式能够提高代码的可维护性和整体设计的灵活性。