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

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个数据库连接.  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值