简介:单例
-
一个类有且仅有一个实例
-
提供一个唯一实例的全局访问接口
单例模式确保某一个类只有一个实例,向整个系统提供这个实例。 也就是一个应用程序中只被实例化一次,这样可以很大程度的节省系统的开销。
下面提供几份常见的编程方式,它们的区别在于,什么时候进行实例化。
程序运行调用实例化
/// <summary> /// sealed 不能被继承,防止派生该类 /// </summary> public sealed class SingleBegin { /// <summary> /// 程序运行调用实例化 /// </summary> private static SingleBegin g_inst = new SingleBegin(); /// <summary> /// private 私有,防止被人手动实例化 /// </summary> private SingleBegin() { } /// <summary> /// 提供全局唯一单例调用接口 /// </summary> public static SingleBegin Inst { get { return g_inst; } } public void Display() { Console.WriteLine("程序运行即刻实例化 SingleBegin"); } }
在静态构造函数中实例化(这只能算半个,因为可以被多次实例化)
/// <summary> /// sealed 不能被继承,防止派生该类 /// </summary> public sealed class SingleBegin { private static SingleBegin g_inst = null; /// <summary> /// 会被再次实例化,所以这个算半个 /// </summary> static SingleBegin() { /// <summary> /// 使用时调用实例化 /// </summary> g_inst = new SingleBegin(); } /// <summary> /// 提供全局唯一单例调用接口 /// </summary> public static SingleBegin Inst { get { return g_inst; } } public void Display() { Console.WriteLine("程序运行即刻实例化 SingleBegin"); } }
调用单例Inst时实例化(推荐用这种)
/// <summary> /// sealed 不能被继承,防止派生该类 /// </summary> public sealed class SingleWorld { private static SingleWorld g_inst = null; /// <summary> /// private 私有,防止被人手动实例化 /// </summary> private SingleWorld() { } /// <summary> /// 提供全局唯一单例调用接口 /// </summary> public static SingleWorld Inst { get { if (null == g_inst) { // 调用时实例化 g_inst = new SingleWorld(); } return g_inst; } } public void Display() { Console.WriteLine("普通单例 SingleWorld"); } }