1. 单件模式(Singleton Pattern) ---------- 创建型模式

来源:互联网 发布:网络五层协议 编辑:程序博客网 时间:2024/06/01 10:10

1. Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。

2. GOF实现(单线程模式)

public class Singleton                
{                                            
    private static Singleton instance=null;          
                                             
    private Singleton()                              
    {                                        
    }                                        
                                             
    public static Singleton Instance         
    {                                        
        get                                  
        {                                    
            if (instance==null)              
            {                                
                instance = new Singleton();  
            }                                
            return instance;                 
        }                                    
    }                                        
}                                            

潜在的问题: 在单线程下, 此模式可以正确工作. 但是在多线程模式下,如果instance没有初使化,线程A运行完if(instance == null)判断后挂起, 线程B执行此代码判断, 会得到同样的结果去执行构造函数,得到两个实例.

注意此模式下构造函数修饰符是private,所以没有办法通过构造函数来产生实例, 只能通过Instance属性得到.

3. 多线程模式

a. 利用lock锁定

public class Singleton                       
{                                                   
    private static Singleton instance=null;                 

    private static readonly object padlock = new object();   
                                                     
    private Singleton()                                     
    {                                               
    }                                               
                                                    
    public static Singleton Instance                
    {                                               
        get                                         
        {                                           
            lock (padlock)                          
            {                                       
                if (instance==null)                 
                {                                   
                    instance = new Singleton();     
                }                                   
                return instance;                    
            }                                       
        }                                           
    }                                               
}                                                   

此种模式不错, 但是损失性能.

b. 利用静态构造器

public class Singleton                           
{                                                       
    private static readonly Singleton instance=new Singleton(); 
                                                        
    private static Singleton()                                  
    {                                                   
    }                                                   
                                                        
    private Singleton()                                         
    {                                                   
    }                                                   
                                                        
    public static Singleton Instance                    
    {                                                   
        get                                             
        {                                               
            return instance;                            
        }                                               
    }                                                   
}                                                       

其它还有许多实现变种, 如双重校验提高性能啊之内的. 

值得一提的是在singleton模式中,一般不要实现序列化, 克隆方法. 否则可以根据此方法生成多个实例, 从而失去singleton模式的宗旨.

设计模式的关键就是隐藏构造函数,使其只能在类的内部被调用, 从而限制实例的生成.  对singleton模式稍加改变, 限制其生成的个数, 就可以改制成对象池. 如最多生成5个数据库连接.  

 

原创粉丝点击