动机:在软件系统中,经常有这样的一些特殊的类,必须保证它们在系统中 只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率
意图:保证一个类仅有一个实例,并提供一个该实例的全局访问点
UML图:
示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Singleton
{
/// <summary>
/// 只适用单线程下的单例模式,在多线程下无法保证其唯一实例
/// </summary>
//public class Singleton
//{
// private static Singleton instance;
// private Singleton() { }
// public static Singleton Instance
// {
// get
// {
// if (instance == null)
// {
// instance = new Singleton();
// }
// return instance;
// }
// }
//}
/// <summary>
/// 第一种:多线程单例模式的设计
/// </summary>
//public class Singleton
//{
// //volatile 会保证编译器不对代码指令的执行调整顺序,而保证其严格意义上的的按顺序执行
// private static volatile Singleton instance=null;
// private static object lockHepler = new object();//起辅助作用
// private Singleton() { }
// public static Singleton Instance
// {
// get
// {
// if (instance==null)
// {
// lock (lockHepler)
// {
// if (instance == null)
// {
// instance = new Singleton();
// }
// }
// }
// return instance;
// }
// }
//}
/// <summary>
/// 第二种:多线程单例模式的设计
/// </summary>
public class Singleton
{
public static readonly Singleton Instance = new Singleton();//内联初始化
private Singleton() { }
}
/// <summary>
/// 第二种实现等同于下面的实现,但这两者的弊端:就是不支持参数化传递的构造器
/// </summary>
//public class Singleton
//{
// public static readonly Singleton Instance;
// //.NET机制会保证只有一个线程执行此82行代码,以加锁的方式防止又一个线程执行
// //在第一次访问任意静态字段之前,都会执行静态构造器,以保证静态字段都已初始化
// static Singleton() { Instance = new Singleton(); }
// private Singleton() { }
//}
}
注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考