Intent
Ensure a class only has one instance, and provide a global point of access to it.
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Motivation
在软件系统中,经常有这样特殊类,必须保证在系统中有且仅有一个实例.就此引出单件模式。
如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?
Structure

Case
张三现在要娶个老婆(男女未定),既new一个老婆对象。而社会又如何约束他乖乖的娶个老婆呢?下面引出几个问题
- 如何保证张三只能娶一个老婆?
- 张三风流倜傥,同一时间内跟N个女人来往、拍拖。跟N个女人结婚?
- 结婚手续基本办妥了,张三性取向突然改变,喜欢男人了。咋办?
- 张三在中国娶了个老婆,到日本弄了个ID,又娶个老婆?而他还依然还是张三。
Implementation
- 针对第一个问题,引出Singleton的基本实现
public class WifeSingleton
{
private static WifeSingleton wifeInstance;
private WifeSingleton()
{ }
public static WifeSingleton WifeInstance
{
get
{
if (wifeInstance==null)
{
wifeInstance = new WifeSingleton();
}
return wifeInstance;
}
}
}
使用这种方式的前提是张三很专一,很老实.对待MM,没有多线操作。Just like me.^_^。 这种方式一般是不安全的,毕竟跟程序员一样纯洁的人并不多。
- 针对第二个问题:如何强迫张三娶不到小老婆呢?通过第三方的约束。法律、道德!
public class WifeInLawSingleton
{
private static volatile WifeInLawSingleton wifeInstance;
//通过辅助对象,约束张三只能娶一个老婆
private static Object Law = new object();
/**//// <summary>
/// 老婆的外貌
/// </summary>
private string appearance;
/**//// <summary>
/// 老婆的人品
/// </summary>
private string character;
private WifeInLawSingleton(string appearance, string character)
{
this.appearance = appearance;
this.character = character;
}
public static WifeInLawSingleton WifeInstance()
{
if (wifeInstance==null)
{
lock (Law)
{
wifeInstance = new WifeInLawSingleton(pretty, loyalty);
}
}
return wifeInstance;
}
} 这种方式保证了张三只能娶一个老婆,双重锁定,解决了线程的并发问题。对于多线程来说,它是安全的。
至于张三是否去包二奶又是另外一个话题了,通过法律的制约,至少确定了他只能娶一个老婆。
但是,
强迫张三只能娶女人当老婆貌似有违人情,不尽人道。如今绝大多数艺术职业者提倡性自由,无所谓男女。断背山的比比皆是。况且科学发展到今天,男人生育并不是难事.
现在在我们程序中,引入性别为男的老婆。对象的性质不同。咋办呢?
- 在Framework1.1之前,或许我们得重新修改程序。但在2.0之后,泛型的出现,找个男的老婆就相对简单多了。

public class WifeSingleton<T> where T : new()
{
private static volatile T wifeSingleton;
private static Object law = new object();
public static T WifeSingleton
{
get
{
if (wifeSingleton == null)
{
lock (law )
{
wifeSingleton = new T();
}
}
return wifeSingleton;
}
}
}
Singleton模式相对简单,暂且先介绍到这。Demo有点牵强,见谅。
------------------------------------------------------------------
参考文献
WebCast 《C#面向对象设计纵横谈》
《Design Patterns, Elements Of Reusable Object Oriented Software》



