C#23种设计模式:Singleton模式详解
需积分: 9 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机制来确保在多线程情况下实例化的安全性。
**单件模式的优点**
单件模式的优点有:
* 保证了类的唯一实例化
* 提供了一个统一的访问入口
* 可以通过子类化来扩展
**单件模式的缺点**
单件模式的缺点有:
* 可能会导致类的耦合性增加
* 可能会导致类的可测试性降低
单件模式是一种非常有用的设计模式,它可以保证类的唯一实例化,并提供一个统一的访问入口。但是,在使用单件模式时,需要注意类的耦合性和可测试性。
2014-02-18 上传
2012-11-18 上传
2021-10-18 上传
2011-02-22 上传
2009-05-14 上传
2010-06-14 上传
2009-03-24 上传
qqguandandan
- 粉丝: 0
- 资源: 2
最新资源
- WordPress作为新闻管理面板的实现指南
- NPC_Generator:使用Ruby打造的游戏角色生成器
- MATLAB实现变邻域搜索算法源码解析
- 探索C++并行编程:使用INTEL TBB的项目实践
- 玫枫跟打器:网页版五笔打字工具,提升macOS打字效率
- 萨尔塔·阿萨尔·希塔斯:SATINDER项目解析
- 掌握变邻域搜索算法:MATLAB代码实践
- saaraansh: 简化法律文档,打破语言障碍的智能应用
- 探索牛角交友盲盒系统:PHP开源交友平台的新选择
- 探索Nullfactory-SSRSExtensions: 强化SQL Server报告服务
- Lotide:一套JavaScript实用工具库的深度解析
- 利用Aurelia 2脚手架搭建新项目的快速指南
- 变邻域搜索算法Matlab实现教程
- 实战指南:构建高效ES+Redis+MySQL架构解决方案
- GitHub Pages入门模板快速启动指南
- NeonClock遗产版:包名更迭与应用更新