01Singleton (Creational Pattern)

保证一个类仅有一个实例,并提供一个该实例的全局访问点。

1.简单的Singleton

 1 //单例设计模式 这种情况不能应对多线程
 2     class Singleton
 3     {
 4         private static Singleton instance;
 5         private Singleton() { }
 6         public static Singleton Instance
 7         {
 8             get
 9             {
10                 if (Instance == null)
11                 {
12                     instance = new Singleton();
13                 }
14                 return instance;
15             }
16         }
17     }

2.应对多线程

 1  //多线程
 2     class ThreadSingleton
 3     {
 4         //不用volatile还是有可能出现多实例的产生
 5         //保证特定实例不会重新排列  //可以写成方法 也可以写成属性
 6         private static volatile ThreadSingleton instance = null;
 7         //辅助器,不参与变化
 8         private static object lockHelper = new object();
 9         private ThreadSingleton() { }
10         public static ThreadSingleton Instance
11         {
12             get
13             {
14                 if (instance == null)
15                 {
16                     lock (lockHelper)
17                     {
18                         if (instance == null)
19                         {
20                             instance = new ThreadSingleton();
21                         }
22                     }
23                 }
24                 return instance;
25             }
26         }
27     }

3.简单的单例模式

    //另一种经典的 
    //只适用于无参的时候
    class MSDNSingleton
    {
        public static readonly MSDNSingleton Instance = new MSDNSingleton();
        //私有构造器
        private MSDNSingleton { }
    }

 解释上边的单例模式

 1     class MSDNSingleton
 2     {
 3         //实现了内联初始化
 4         public static readonly MSDNSingleton Instance; // = new MSDNSingleton();
 5         //静态的构造器  1.执行时间:如果想执行,那么一定是先执行静态构造器(BeforeFieldInit)2.如果不用就不实例化
 6         //3.在多个线程下,只有一个线程执行
 7         static MSDNSingleton()  
 8         {
 9             Instance=new MSDNSingleton();
10         }        
11         //私有构造器
12         private MSDNSingleton() { }
13         }

虽然很方便,但是不支持参数化的构造器(静态构造器是不能传参数的,是系统调用的)

构造器传参数的方法用第一种和第二种,如果第三种也要实现的话,可以设计与构造器进行隔离的方法

 1   //支持参数化构造器的方式
 2     class ParamSingleton
 3     {
 4         private static ParamSingleton instance;
 5         private ParamSingleton(int x, int y)
 6         {
 7             this.x = x;
 8             this.y = y;
 9         }
10         public static ParamSingleton GetInstance(int x,int y) 
11         {
12             if (instance == null)
13             {
14                 instance = new ParamSingleton(x, y);
15             }
16             else
17             {
18                 instance.x = x;
19                 instance.y = y;
20             }
21                 return instance;            
22         }
23         int x;
24         int y;
25     }
 1 /静态构造函数不支持传参,可以设计与构造器进行隔离的方法
 2     class MSDNParamSingleton
 3     {
 4         public readonly static MSDNParamSingleton Instance = new MSDNParamSingleton();
 5         private MSDNParamSingleton() { }
 6         //与构造器进行隔离
 7         int x;
 8         int y;
 9         public int X
10         {
11             get
12             {
13                 return this.x;
14             }
15             set
16             {
17                 this.X = x;
18             }
19         }
20         public int Y
21         {
22             get { return y; }
23             set { value=y;}
24         }
25     }

Singleton模式扩展

讲一个实例扩展到n个实例,例如对象池的实现

将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。

理解和扩展Singleton Pattern的核心是"如何控制用户,使用new对一个类的实例构造器的任意调用"。

 

.NET框架中的Singleton拓展应用  

  MyClass c1 = new MyClass();
  MyClass c2 = new MyClass();
  //
  Type t1 = c1.GetType();
  Type t2 = c2.GetType();

推荐的好书:
  重构:改善既有代码的设计 Martin Fowler
  敏捷软件开发:原则 模式与实践 RobertC Martin
  面向对象分析与设计 Grady booch
  设计模式:可复用面向对象软件的基础 Gof
  Refactoring to Patterns: joshua Kerievsky

.NET框架中的Singleton应用
  Type 和HttpContext 是对应用和拓展

 

 

posted @ 2012-09-21 23:26  51秒懂  阅读(161)  评论(0编辑  收藏  举报