2. Singleton单件(创建型模式)

模式分类
从目的来看:
– 创建型(Creational)模式:负责对象创建。
– 结构型(Structural)模式:处理类与对象间的组合。
– 行为型(Behavioral)模式:类与对象交互中的职责分配。
从范围来看:
– 类模式处理类与子类的静态关系。
– 对象模式处理对象间的动态关系。

动机(Motivation)
在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、
以及良好的效率。
如何绕过常规的构造器,提供一种机制来保证一个类只有
一个实例?
这应该是类设计者的责任,而不是使用者的责任。

意图(Intent)
保证一个类仅有一个实例,并提供一个该实例的全局访问点。——《设计模式》GoF

结构(Structure)

image

 

单线程Singleton 模式实现

单线程Singleton模式
///   <summary>
///  单线程Singleton模式
///   </summary>
public   class  Class1
{
     
private   static  Class1 c1;
     
private  Class1()  {}

  
public   static  Class1 C1
  {
      
get
      {
          
if  (c1  ==   null )
          {
              c1 
=   new  Class1();
          }
          
return  c1;
      }
  }
}

单线程Singleton模式的几个要点

  1. Singleton模式中的实例构造器可以设置为protected以允许子类派生。
  2. Singleton模式一般不要支持ICloneable接口,因为这可能会导致多个对象实例,与Singleton模式的初衷违背。
  3. Singleton模式一般不要支持序列化,因为这也有可能导致多个对象实例,同样与Singleton模式的初衷违背。
  4. Singletom模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。就支持垃圾回收的平台和对象的开销来讲,我们一般没有必要对其销毁进行特殊的管理。
  5. 不能应对多线程环境:在多线程环境下,使用Singleton模式仍然有可能得到Singleton类的多个实例对象。

多线程Singleton 模式实现

多线程Singleton模式
///   <summary>
///  多线程Singleton模式,方法1
///   </summary>
public   class  Class2
{
    
public   static   readonly  Class2 C2  =   new  Class2();
    
private  Class2(){}
}

///   <summary>
// 多线程Singleton模式,方法1,相当于这样
///   </summary>
public   class  Class3
{
    
public   static  Class3 c3;
    
static  Class3()
    {
        c3 
=   new  Class3();
    }

    
private  Class3(){}
}

///   <summary>
///  多线程Singleton模式,方法2
///   </summary>
public   class  Class4
{
    
private   static   volatile  Class4 c4  =   null ;

    
private   static   object  lockHelper  =   new   object ();

    
private  Class4() { }

    
public   static  Class4 C4()
    {
        
if  (c4  ==   null )
        {
            
lock  (lockHelper)
            {
                
if  (c4  ==   null )
                {
                    c4 
=   new  Class4();
                }
            }
        }
        
return  c4;
    }
}

 

 

 单,多线程Singleton模式.构造函数带参数

单,多线程Singleton模式.构造函数带参数
///   <summary>
///  单线程Singleton模式,构造函数带参数
///   </summary>
public   class  Class5
{
    
int  _x, _y;
    
private   static  Class5 c5;
    
private  Class5( int  x,  int  y)
    {
        
this ._x  =  x;
        
this ._y  =  y;
    }

    
public   static  Class5 getClass5( int  x,  int  y)
    {
        
if  (c5  ==   null )
        {
            c5 
=   new  Class5(x, y);
        }
        
else
        {
            c5._x 
=  x;
            c5._y 
=  y;
        }
        
return  c5;
    }
}

///   <summary>
///  多线程Singleton模式,方法2,构造函数带参数
///   </summary>
public   class  Class6
{
    
private   static   volatile  Class6 c6  =   null ;

    
private   static   object  lockHelper  =   new   object ();

    
int  _x, _y;

    
private  Class6( int  x,  int  y)
    {
        
this ._x  =  x;
        
this ._y  =  y;
    }

    
public   static  Class6 C6( int  x,  int  y)
    {
        
if  (c6  ==   null )
        {
            
lock  (lockHelper)
            {
                
if  (c6  ==   null )
                {
                    c6 
=   new  Class6(x, y);
                }
            }
        }
        
else
        {
            c6._x 
=  x;
            c6._y 
=  y;
        }
        
return  c6;
    }
}

///   <summary>
///  多线程Singleton模式,方法1,构造函数带参数.
///   </summary>
public   class  Class7
{
    
public   static   readonly  Class7 c7  =   new  Class7();
    
int  _x, _y;

    
private  Class7()
    {
    }

    
public   void  Init( int  x,  int  y)
    {
        
this ._x  =  x;
        
this ._y  =  y;
    }

    
// 或者
     public   int  x
    {
        
get
        {
            
return   this ._x;
        }
        
set
        {
            
this ._x  =  value;
        }
    }

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

}

 

 

 测试代码:

代码
     private   void  button1_Click( object  sender, System.EventArgs e)
    {
        Class1 c1 
=  Class1.C1;
        Class2 c2 
=  Class2.C2;
        Class3 c3 
=  Class3.c3;
        Class4 c4 
=  Class4.C4();
        Class5 c5 
=  Class5.getClass5( 3 4 );
        Class6 c6 
=  Class6.C6( 3 4 );

        Class7 c7 
=  Class7.c7;
        c7.Init(
3 4 );
        c7.x 
=   3 ;
        c7.y 
=   4 ;

        Class1 cc1 
=  Class1.C1;
        Class2 cc2 
=  Class2.C2;
        Class3 cc3 
=  Class3.c3;
        Class4 cc4 
=  Class4.C4();
        Class5 cc5 
=  Class5.getClass5( 3 4 );
        Class6 cc6 
=  Class6.C6( 3 4 );

        Class7 cc7 
=  Class7.c7;
        cc7.Init(
3 4 );
        cc7.x 
=   9 ;
        cc7.y 
=   10 ;

        
if  (c1  ==  cc1  &&  c2  ==  cc2  &&  c3  ==  cc3  &&  c4  ==  cc4
         
&&  c5  ==  cc5  &&  c6  ==  cc6  &&  c7  ==  cc7)
        {
            MessageBox.Show(
" Yes " );
        }
        
else
        {
            MessageBox.Show(
" No " );
        }

        MessageBox.Show(c7.x.ToString());
        MessageBox.Show(cc7.x.ToString());

    }

 

 

你可能感兴趣的:(Singleton)