设计模式之单件模式(Singleton)
2009-09-07 22:09
405 查看
网上找到单件模式的C#实现方式,特记录下来,顺带加深记忆~~~
对于它,有很多称呼:单件、单体、单例,都是在说它——Singleton,本文主要是用的单件。顾名思义,单,何为“单”,即唯一,仅有之意。
单件模式的中心思想就是说程序中的某一个类,我们在实例化它的时候,想让所得到的实例有,且仅有一个,这个就是单件模式。GOF书中对其描述为:“保证一个类仅有一个实例,并提供一个访问它的全局访问点”。
单件模式在开发中还是比较常见的一种设计模式,比如,在开发WinForm的时候,做某个程序需要实现类似于工具箱之类的功能,这里就可以用到单件模式。在使用Photoshop等软件的时候,我们点击“视图”——“工具箱”,就可以在主界面上显示出工具箱了,但是,如果还有一个按钮,也是控制工具箱的显示的话,这两个事件都是实现了对工具箱的显示,如果依次触发,岂不是会生成很多个工具箱出来,所以,这里应该判断一下该工具箱的类是否已经存在(即判断对象是否为null)或者暂时性的隐藏了(即判对象的IsDisposed否为为true),但是,这样又产生了一个问题,那就是,只要有能够触发显示工具箱的事件,就应该出现该if的判断,这样就是造成了大量的代码重复,还有可能导致内存大量的消耗,而且万一要是需求有什么变化,修改起来相当的不方便。此时此刻,用单件模式就最好不过了(思路就是让工具箱这个类成为唯一的)。
我们知道,在一个类中,如果其构造函数是私有的,那么,这个类是不能通过关键字“new”来实例化的,所以,单件模式正是利用了这一点,并且还利用了静态变量在全局中是恒定不变的这一特性,来实现了单件模式,即:有,且仅有,一个实例!
在.NET中,如Type对象、HttpContext.Current等都使用了单件模式。
说了这么多文字性的东西,还是用代码来实现才是最好的说明。
一、首先建立一个普通的类
[align=left]1 public class SampleSingleton
2 {
3 }[/align] 二、将该类修改成以下样子(注意代码中的注释)
[align=left]多线程下的Singleton
1 public class SampleSingleton
2 {
3 private static SampleSingleton _instance;
4 private static object _obj = new object();
5
6 private SampleSingleton()
7 {
8 }
9
10 public static SampleSingleton Instance
11 {
12 get
13 {
14 if (_instance == null)
15 {
16 lock (_obj)
17 {
18 if (_instance == null)
19 {
20 _instance = new SampleSingleton();
21 }
22 }
23 }
24
25 return _instance;
26 }
27 }
28 }[/align] 好了,差不多就这么多了,综上所述,创建单件模式(Singleton)必须具备以下三个条件:
1、私有构造函数(防止其他对象创建实例)。
2、一个单件类型的私有变量。
3、静态全局获取接口。
还有就是在使用中,要注意的几个问题:
1、该模式一般不要支持ICloneable接口,因为可能导致多个对象实例。
2、该模式一般不要支持序列化,同样是因为可能导致多个对象实例。
3、该模式一般不建议使用到多线程环境中,同样,还是因为可能导致多个对象实例,如果要使用,一定要注意双检查。
4、该模式只考虑到了对象创建的管理,没有考虑对像的销毁管理。不过,就支持垃圾回收的平台和对象的开销来讲,一般没有必要对其销毁进行特殊的管理。
对于它,有很多称呼:单件、单体、单例,都是在说它——Singleton,本文主要是用的单件。顾名思义,单,何为“单”,即唯一,仅有之意。
单件模式的中心思想就是说程序中的某一个类,我们在实例化它的时候,想让所得到的实例有,且仅有一个,这个就是单件模式。GOF书中对其描述为:“保证一个类仅有一个实例,并提供一个访问它的全局访问点”。
单件模式在开发中还是比较常见的一种设计模式,比如,在开发WinForm的时候,做某个程序需要实现类似于工具箱之类的功能,这里就可以用到单件模式。在使用Photoshop等软件的时候,我们点击“视图”——“工具箱”,就可以在主界面上显示出工具箱了,但是,如果还有一个按钮,也是控制工具箱的显示的话,这两个事件都是实现了对工具箱的显示,如果依次触发,岂不是会生成很多个工具箱出来,所以,这里应该判断一下该工具箱的类是否已经存在(即判断对象是否为null)或者暂时性的隐藏了(即判对象的IsDisposed否为为true),但是,这样又产生了一个问题,那就是,只要有能够触发显示工具箱的事件,就应该出现该if的判断,这样就是造成了大量的代码重复,还有可能导致内存大量的消耗,而且万一要是需求有什么变化,修改起来相当的不方便。此时此刻,用单件模式就最好不过了(思路就是让工具箱这个类成为唯一的)。
我们知道,在一个类中,如果其构造函数是私有的,那么,这个类是不能通过关键字“new”来实例化的,所以,单件模式正是利用了这一点,并且还利用了静态变量在全局中是恒定不变的这一特性,来实现了单件模式,即:有,且仅有,一个实例!
在.NET中,如Type对象、HttpContext.Current等都使用了单件模式。
说了这么多文字性的东西,还是用代码来实现才是最好的说明。
一、首先建立一个普通的类
[align=left]1 public class SampleSingleton
2 {
3 }[/align] 二、将该类修改成以下样子(注意代码中的注释)
[align=left]多线程下的Singleton
1 public class SampleSingleton
2 {
3 private static SampleSingleton _instance;
4 private static object _obj = new object();
5
6 private SampleSingleton()
7 {
8 }
9
10 public static SampleSingleton Instance
11 {
12 get
13 {
14 if (_instance == null)
15 {
16 lock (_obj)
17 {
18 if (_instance == null)
19 {
20 _instance = new SampleSingleton();
21 }
22 }
23 }
24
25 return _instance;
26 }
27 }
28 }[/align] 好了,差不多就这么多了,综上所述,创建单件模式(Singleton)必须具备以下三个条件:
1、私有构造函数(防止其他对象创建实例)。
2、一个单件类型的私有变量。
3、静态全局获取接口。
还有就是在使用中,要注意的几个问题:
1、该模式一般不要支持ICloneable接口,因为可能导致多个对象实例。
2、该模式一般不要支持序列化,同样是因为可能导致多个对象实例。
3、该模式一般不建议使用到多线程环境中,同样,还是因为可能导致多个对象实例,如果要使用,一定要注意双检查。
4、该模式只考虑到了对象创建的管理,没有考虑对像的销毁管理。不过,就支持垃圾回收的平台和对象的开销来讲,一般没有必要对其销毁进行特殊的管理。
相关文章推荐
- 【设计模式基础】创建型模式 - 1 - 单件(Singleton)
- 【设计模式】学习笔记7:单件模式(Singleton)
- 设计模式学习之单件模式(Singleton)
- 设计模式: 单件(singleton)模式(2015-04-29 11:46)
- 设计模式学习笔记(二)——Singleton单件模式
- [整理]C#面向对象设计模式纵横谈(2):Singleton单件(创建型模式)
- 设计模式 3.5 Singleton(单件)-对象创建型模式
- 面向对象的设计模式系列之一:单件模式(Singleton)
- 关于动态单例设计模式或动态单件设计模式—Singleton
- 设计模式学习笔记(二)——Singleton单件模式
- 2.面向对象设计模式学习之Singleton单件模式
- 设计模式一日一练:单件模式(Singleton)
- 一起谈.NET技术,C#面向对象设计模式纵横谈:Singleton 单件
- VB.net设计模式之单件模式(singleton)
- [设计模式]SINGLETON(单件)_对象创建型模式
- PHP设计模式之单件(Singleton)
- 设计模式之单件模式(Singleton)
- 设计模式之单件模式(Singleton)
- 设计模式之单件(Singleton)的应用
- java设计模式之单件模式Singleton