C#23种设计模式:Singleton模式详解

需积分: 9 0 下载量 138 浏览量 更新于2024-07-26 收藏 2.34MB DOC 举报
C# 设计模式之单件模式 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。单件模式(Singleton Pattern)就是为了解决这个问题而提出的,它能够保证一个类仅有一个实例,并提供一个访问它的全局访问点。 **单件模式的动机** 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。例如,在一个系统中,可能只有一个配置文件对象,或者一个日志对象,这些对象的实例化应该被限制在系统中只出现一次。 **单件模式的结构图** 单件模式的结构图如图所示: [pic] **单件模式的意图** 单件模式的意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点。这个模式可以确保系统中的某些类只能实例化一次,並提供一个统一的访问入口。 **单件模式的生活例子** 单件模式的生活例子如图所示: [pic] **单件模式的适用性** 单件模式的适用性有两个方面: 1. 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 2. 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。 **单件模式的代码实现** 单件模式的代码实现可以分为两种:单线程Singleton实现和多线程Singleton实现。 **单线程Singleton实现** 单线程Singleton实现的代码如下所示: ```csharp class SingleThread_Singleton { private static SingleThread_Singleton instance = null; private SingleThread_Singleton() { } public static SingleThread_Singleton Instance { get { if (instance == null) { instance = new SingleThread_Singleton(); } return instance; } } } ``` 这个实现可以在单线程情况下工作正常,但是在多线程情况下却不是安全的。因为在多线程情况下,多个线程可能同时访问这个实例,导致实例化多次。 **多线程Singleton实现** 为了解决多线程情况下的问题,我们可以使用多线程Singleton实现。代码如下所示: ```csharp class MultiThread_Singleton { private static volatile MultiThread_Singleton instance = null; private static object lockObj = new object(); private MultiThread_Singleton() { } public static MultiThread_Singleton Instance { get { if (instance == null) { lock (lockObj) { if (instance == null) { instance = new MultiThread_Singleton(); } } } return instance; } } } ``` 这个实现使用了lock机制来确保在多线程情况下实例化的安全性。 **单件模式的优点** 单件模式的优点有: * 保证了类的唯一实例化 * 提供了一个统一的访问入口 * 可以通过子类化来扩展 **单件模式的缺点** 单件模式的缺点有: * 可能会导致类的耦合性增加 * 可能会导致类的可测试性降低 单件模式是一种非常有用的设计模式,它可以保证类的唯一实例化,并提供一个统一的访问入口。但是,在使用单件模式时,需要注意类的耦合性和可测试性。