在软件系统中,经常有一些类需要在整个系统中只能存在一个实例,才能保证系统逻辑的正确性及运行效率。如何能够绕过构造器提供一种机制保证只创建一个实例?在这种需求的前提下,单件模式应运而生!
意图:保证一个类只有一个实例,并提供一个合局访问点访问他们。
适用性:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。
线程代码实现:
class SingleThread_Singleton
{
private static SingleThread_Singelton instance = null;
private SingleThread_Singleton(){}
public static SinleThread_Singleton Instance
{
get
{
if(instance == null)
{
instance = new SingleThread_Singleton();
}
return instance;
}
}
}
上述代码在单线程环境下执行是没问题的,但如果在多线程时同时执行if(instance == null)时就会出现多个实例,如果想在多线程下保证单件模式,那么需要修改代码如下:
class MultiThread_Singleton
{
private static volatile MultiThread_Singelton instance = null;
private static object lookHelper = new object();
private MultiThread_Singleton(){}
public static MultiThread_Singleton Instance
{
get
{
if(instance == null)
{
lock(lookHelper)
{
instance = new MultiThread_Singleton();
}
}
return instance;
}
}
}
静态Singleton的实现:
class Static_Singleton
{
public static readonly Static_Singleton instance = new Static_Singleton();
private Static_Singleton(){}
}
这样就保证了instance的绝对的唯一实例;