通过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 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);
}
{
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);
}
}
{
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);
}
}