设计模式——单例模式

  单例模式——保证一个类仅有一个实例,并提供一个访问它的全局访问点

  单例模式是为了解决全局只允许存在一个实例,防止出现多个实例扰乱程序的正常的运行,单例模式不是一个时刻都需要运用的模式,是情非得已下才使用的

  它在多线程的条件下使用时必须要加锁才行,这样就造成了两种实现方式,分为“饿汉式”和“懒汉式”。

  “饿汉式”单例的实现,饿汉式的实现方式在于静态初始化时就自己实例化了自己,不需要外部进行初始化,提前占用资源。、

1.创建一个单例类,定义为sealed不可继承,并且在初始化的时候就自己创建了一个实例,外部调用时将这个实例返回回去。

 1 /// <summary>
 2 /// 定义这个类不可继承
 3 /// </summary>
 4 public sealed class Singleton
 5 {
 6     //定义一个静态实例,当初始化时就将自己实例化
 7     //readonly该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中
 8     private static readonly Singleton Instance=new Singleton();
 9 
10     /// <summary>
11     /// 改造该类的构造方法
12     /// 不允许外部实例化
13     /// </summary>
14     private Singleton()
15     {
16     }
17 
18     /// <summary>
19     /// 给外部一个实例化对象的方法
20     /// 当对象存在时,直接返回对象
21     /// </summary>
22     /// <returns></returns>
23     public static Singleton GetInstance()
24     {
25         return Instance;
26     }
27 }
Singleton.cs

  “懒汉式单例”时自己不创建自己的实例,当第一个给外部调用的时候才创建实例,以后再次调用的时候,判断是否为Null,不为null就返回前面创建的实例,当然,为了解决多线程并发的问题,创建时需要加锁。

2.创建一个单例,定义一个实例,并创建一个锁,提供给外部一个获得实例的方法,方法里面进行非空验证,为空则加锁创建实例。

 1 public class Singleton
 2 {
 3     /// <summary>
 4     /// 定义一个静态实例
 5     /// </summary>
 6     private static Singleton _instance;
 7 
 8     /// <summary>
 9     /// 创建一个锁
10     /// </summary>
11     private static readonly object SyncRoot=new object();
12 
13     /// <summary>
14     /// 将构造方法改为私有的,不允许外部调用并且实现new
15     /// </summary>
16     private Singleton(){}
17 
18     /// <summary>
19     /// 提供一个给外部获得实例的方法
20     /// </summary>
21     /// <returns></returns>
22     public static Singleton GetInstance()
23     {
24         //判断是否为null
25         if (_instance==null)
26         {
27             //加锁创建实例
28             lock (SyncRoot)
29             {
30                 //再进行一次非空判断是防止两个进程同时通过了非null判断
31                 //另一个在排队,就会造成再一次创建实例
32                 if (_instance==null)
33                 {
34                      _instance=new Singleton();
35                 }
36             }
37         }
38         return _instance;
39     }
40 }
Singleton.cs

                                                          以上内容部分参考程杰的《大话设计模式》一书

  

 

posted @ 2013-05-29 23:16  Kitten Zhang  阅读(136)  评论(0编辑  收藏  举报