单例模式(Singleton)

 

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

实现方法一:  

   class Singleton
    
//多线程singleton代码
        private static volatile Singleton instance;  
       
//volatile关键字可防止编译器对所申请的字段优化,以保持字段的最新状态
        private  static readonly object obj = new object();
        
private Singleton()  //private 禁止外部构造
         { }
        
public static Singleton Intance
        
{
            
get
            
{
                
if (instance == null)  //如果没有实例化则实例化
                 {
                    
lock (obj)  //锁定obj对象防止多线程访问
                     {
                        
if (instance == null)  //双检测
                         {
                            instance = 
new Singleton();
                        }
                    }
                }
                
return instance;
            }
        }        
    }

实现方法二: 

 1 //通过静态实例实现,非惰性加载
 2 public sealed class Singleton 
 3 
 4    //
静态初始化在自己被加载时将自己实例例化,也称饿汉式单例类
 5    private static readonly Singleton instance = new Singleton();
 6    private Singleton(){} 
 7    public static Singleton Instance 
 8    { 
 9       get 
10       { 
11          return instance; 
12       } 
13    } 
14 

这种实现简单,线程安全,缺陷主要是instance不是惰性加载的。准确的说是不一定是惰性加载的,因为我们无法得知instance

 public sealed class Moon  //sealed防止被继承子类实例化
 2          {
 3             private static volatile Moon moon;
 4             private static readonly object obj = new object();
 5              private Moon()  //私有防止外部调用
 7              { }
 8             public static Moon GetMoon
10              {
11                 get
12                  {
13                     if (moon == null)
14                      {
15                         lock (obj)
16                          {
17                             if (moon == null)
18                              {
19                                 moon = new Moon();
20                             }
21                         }
22                     }
23                     return moon;
24                 }
25             }
26             public void DisplayMoon(Time time)
28              {
29                 //根据时间的不同显示不同形状位置的月亮
30             }
31             //其它方法
32         }

posted @ 2009-04-08 17:44  奋斗, 奋斗, 奋斗!  阅读(202)  评论(0编辑  收藏  举报