singleTon 模式

类与类之间是组合关系更好,这样的类与类之间是低耦合,而继承是属于高耦合的关系。
通过OO隔离变化

动机:在soft,有这样的类,必须保证他们在系统之中只有一个实例,才能确保他们的逻辑正确性,以及更好的效率,如果通过常规的构造器,提供一种机制来保证一个类只有一个实例。

意图:保证一个类只有一个实例 ,并提供一个该实例的全局访问点。

要点:
singleton中的实例构造器可以设置为protector以允许子类派生。
singleton一般不要支持ICloneable接口,这样可能导致实例化出多个对象。
singleton一般不支持序列化
singleton一般不能应付多线程环境,这样也可能导致出现多个实例
 //应对于单线程
    public class SingletonA
    
{
        
private static SingletonA instance;

        
//一个私有的构造器,禁用构造器
        private SingletonA() {}

        
public static SingletonA Instance
        
{
            
get
            
{
                
if (instance == null)
                
{
                    instance 
= new SingletonA();
                }

                
return instance;
            }

        }

    }


    
//应对于多线程
    public class SingletonB
    
{
        
//volatile关键字用于禁止编译器对指定的顺序进行微调。
        private static volatile SingletonB instance = null;

        
private static object lockHelper = new object();

        
//一个私有的构造器,禁用构造器
        private SingletonB() {}

        
public static SingletonB Instance
        
{
            
get
            
{
                
//双锁,用于保证只一个线程使用这里,防止多线程产生多个实例。
                if (instance == null)
                
{
                    
lock (lockHelper)
                    
{
                        
if (instance == null)
                            instance 
= new SingletonB();
                    }

                    
                }

                
return instance;
            }

        }

    }

主程序: 

   
   public static void Main()
        
{
            SingletonA t1 
= SingletonA.Instance;

            SingletonA t2 
= SingletonA.Instance;

            Console.WriteLine(
object.ReferenceEquals(t1, t2) == true);
        }

singleton模式扩展
1:将一个实例扩展到N个实例,例如对象池的实现
2:将new构造器的调用转移到其他类中,例如多个类协同工作环境中,某个局部环境只需要拥有某个类的一个实例。
3:理解和扩展singleton模式的核心是:如何控制用户使用new对一个类的实例构造器的任意调用。

带参数的singleton模式:
public class Singleton
{
    
int x;
    
int y ;
    
private static Singleton instance;

    
private Singleton(int x,int y )
    
{
        
this.x = x;
        
this.y = y;
    }


    
public static Singleton GetInstance(int x,int y )
    
{
        
if(instance == null)
        
{
            instance 
= new Singleton(x,y);
        }

        
else
        
{
            instance.x 
= x;
            instance.y 
= y;
        }

        
return instance;
    }

}


public class Test
{
    
public static void Main()
    
{
        Singleton s1 
= Singleton.GetInstance(100,100);
    }

}

posted on 2007-04-15 20:05  tony.zjb  阅读(237)  评论(0编辑  收藏  举报

导航