单件模式:确保一个类只有一个实例,并提供一个全局访问点。
这个模式的定义说得很明白,就是这个类只有一个实例,也就是通过一个“开关”来控制,如果这个类的实例存在,那就不在生成了,当然不存在,那就继续了。关于这个模式网上有许多相关的讲解,有兴趣的可以到TerryLee的博客去看看,可谓讲得很详细,而且写了很多种情况。我比较喜欢看到直观化的东西,因此我在写这个代码的时候相对性去看看显示结果。我在生成实例的时候,将生成时间赋给当前变量,并且通过进程thread来拖延时间再次运行,再次生成实例,如果只能生成一个实例,那么这两个实例的生成时间是一致的,否则就会相差一段时间。在本例中还特地将单件与非单件进行比较,最终得出的结果是完成正确的。如下:
public
sealed class singleton
{
static singleton instance = null;
static readonly object padlock = new object();
public static string Time;
public static string Timex;
static singleton instancex = null;
singleton()
{ }
public static singleton Instance
{
get {
lock (padlock)
{
if (instance == null)
{
instance = new singleton();
Time = DateTime.Now.ToString();
}
return instance;
}
}
}
///
//
非单件测试
public static singleton Instancex
{
get
{
instancex = new singleton();
Timex = DateTime.Now.ToString();
return instancex;
}
}
public string getDescribex()
{
return Timex;
}
public string getDescribe()
{
return Time;
}
}
调用代码:
singleton
s = singleton.Instance; //
单件模式测试
this.label1.Text = s.getDescribe();
Thread.Sleep(3000);
singleton s1 = singleton.Instance;
this.label1.Text += s1.getDescribe();
singleton s2 = singleton.Instancex; //
非单件模式测试
this.label1.Text += "||" + s2.getDescribex();
Thread.Sleep(3000);
singleton s3 = singleton.Instancex;
this.label1.Text += "||" + s3.getDescribex();
单件模式并不是传统的通过构造函数去完成,而是通过属性去完成,当实例具体的去调用这个属性时开始检测并产生实例。