舞步者

带她一起去周游世界
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式之一Singleton模式

Posted on 2008-05-18 21:53  Kevin_Zhang  阅读(110)  评论(0)    收藏  举报

核心:控制用户使用new对一个类实例构造器的任意调用。
Singleton一般不要支持ICLoneable,因为此接口支持克隆,与Singletong初衷不同;也不要支持序列化,也会产生类似的问题。
1.单线程

    public class Singleton
    
{
        
private static Singleton instance;//设置一个静态实例,全局唯一
        public static Singleton Instance  //提供一个全局访问点
        
            
get
            
{
                
if (instance == null)//只有用户需要这个实力的时候,才去初始化。  语句1
                {
                    instance 
= new Singleton();//语句2  如果有两个线程此时都在语句1之后,并且都在语句2之前,那么此时就会创建多个实例了
                }

                
return instance;
            }

        
        }

        
private Singleton()  //约束构造函数
        
        
        }

    }

    
//Main函数的测试代码
    
// Singleton t1 = Singleton.Instance;
    
// Singleton t2 = Singleton.Instance;
    
//Console.WriteLine(object.ReferenceEquals(t1, t2));
2.多线程
    public class Singleton
    
{
        
private static volatile Singleton instance;//volatile关键字表示此字段不接受编译器的代码优化调整,严格保证多线程
        private static object lockHelper = new object();//lock辅助对象
        public static Singleton Instance
        
{
            
get
            
{
                
if (instance == null)
                
{
                    
lock (lockHelper)
                    
{
                        
if (instance == null)//双检查
                        {
                            instance 
= new Singleton();
                        }

                    }

                }

            }

        }

        
private Singleton()
        
{

        }

    }
3.使用静态构造器的代码优化
 public class Singleton
    
{
        
public static Singleton instance = new Singleton();//内联初始化,访问静态成员,首先会调用静态构造器,即new Singleton();会被放到静态构造器中执行
        private Singleton()
        

        
        }
//和下面的代码等价
        
//public static Singleton instance;
        
//static Singleton()//静态构造机制会自动加锁维护,实现线程安全
        
//{
        
//    instance = new Singleton();
        
//}
        
//private Singleton()
        
//{ }
        
//*****************************************************************************************
        
//关于静态构造器的特性解释:
        
//a.无参数,无修饰访问符
        
//b.用于初始化任何静态数据
        
//c.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数,初始化类
        
//d.不能直接调用
        
//e.用户无法控制何时调用,只能有编译器决定调用
        
//f.用于执行仅需执行一次的特定操作

        
//****************************************
       
//缺点不支持参数,但是可以用属性来实现支持参数
        int x;
        
int y;
        
public int X
        
{
            
get return this.x; }
            
set this.x = value; }
        }

        
public int Y
        
{
            
get return this.y; }
            
set this.y = value; }
        }

    }