单例模式(Singleton):保证一个类仅有一个实例并提供一个访问它的全局访问点
实现方法一:
class Singleton
{ //多线程singleton代码
private static volatile Singleton instance;
//volatile关键字可防止编译器对所申请的字段优化,以保持字段的最新状态
private static readonly object obj = new object();
private Singleton() //private 禁止外部构造
{ }
public static Singleton Intance
{
get
{
if (instance == null) //如果没有实例化则实例化
{
lock (obj) //锁定obj对象防止多线程访问
{
if (instance == null) //双检测
{
instance = new Singleton();
}
}
}
return instance;
}
}
}
实现方法二:
1 //通过静态实例实现,非惰性加载
2 public sealed class Singleton
3 {
4 //静态初始化在自己被加载时将自己实例例化,也称饿汉式单例类
5 private static readonly Singleton instance = new Singleton();
6 private Singleton(){}
7 public static Singleton Instance
8 {
9 get
10 {
11 return instance;
12 }
13 }
14 }
这种实现简单,线程安全,缺陷主要是instance不是惰性加载的。准确的说是不一定是惰性加载的,因为我们无法得知instance
public sealed class Moon //sealed防止被继承子类实例化
2 {
3 private static volatile Moon moon;
4 private static readonly object obj = new object();
5 private Moon() //私有防止外部调用
7 { }
8 public static Moon GetMoon
10 {
11 get
12 {
13 if (moon == null)
14 {
15 lock (obj)
16 {
17 if (moon == null)
18 {
19 moon = new Moon();
20 }
21 }
22 }
23 return moon;
24 }
25 }
26 public void DisplayMoon(Time time)
28 {
29 //根据时间的不同显示不同形状位置的月亮
30 }
31 //其它方法
32 }