Singleton模式学习

来源:互联网 发布:淘宝展现位 编辑:程序博客网 时间:2024/05/16 06:04
意图;保证一个类仅用一个实例,并提供一个实例的全局访问点.
 C#代码如下;
using System;

namespace SingletonPatterns
{
    
/// <summary>
    
/// singleton 的摘要说明.
    
///    实现单件模式的3个要点:
    
/// 1.保存实例的私有变量
    
/// 2.私有化的构造函数
    
/// 3.访问这个实例的公共静态函数
    
/// </summary>
    
/// 

    public class Singleton
    
{
        
private static Singleton instance;    // 保存实例的私有变量
        private Singleton()            //
私有化的构造函数
        {}
        
public static Singleton Instance    //访问这个实例的公共静态函数(这里是以字段属性的方式提供的)
        {
            
get
            
{
                
if(instance==null)
                
{
                    instance
=new Singleton();
                }

                
return instance;
            }

        }

    }


}

静态的初始化方式;
public sealed class Singleton 
{
    /// <summary>
    
/// singleton 的摘要说明.
    
///   sealed 防止SIngleton被派生,从而引起

    ///
    
///
    
///
    
/// </summary>

   private static readonly Singleton instance = new Singleton();   // 保存实例的私有变量
   private Singleton(){}       // 私有化的构造函数
   public static Singleton Instance        //访问这个实例的公共静态函数(这里是以字段属性的方式提供的)
   
      
get  
      

         
return instance;  
      }
 
   }
 
}
 
SIngleton在多线程中的应用;
此方法确保了仅在需要实例时才会创建仅一个实例。此外,变量被声明为 volatile,以确保只有在实例变量分配完成后才能访问实例变量。最后,此方法使用 lockObj 实例来进行锁定(而不是锁定类型本身),以避免发生死锁。
using System; 
public sealed class Singleton 

   
private static volatile Singleton instance; 
   
private static object lockObj= new Object(); 
   
private Singleton() {} 
   
public static Singleton Instance 
   

      
get  
      

         
if (instance == null)  
         

            
lock (lockObj)  
            

               
if (instance == null)  
                  instance 
= new Singleton(); 
            }
 
         }
 
         
return instance; 
      }
 
   }
 
}
 

注:模式的应用不应该为了设计而设计,不能把设计模式当成技巧,不能拿来就用.在实际应用中应该'"Refactoring to Patterns'",即在已有代码的基础上经过不断改良过渡到模式.