——《设想形式》
单例形式的观点很简朴,下面以C#言语为例子,列出罕见单例写法的优缺点。
1、简朴完成
public sealed class Singleton { static Singleton instance = null; public void Show() { Console.WriteLine( "instance function"); } private Singleton() { } public static Singleton Instance { get { if (instance == null) { instance = new Singleton(); } return instance; } } }
评注:
关于线程来说不平安
单线程中已满足请求
长处:
由于实例是在 Instance 属性要领内部建立的,因此类能够运用附加功用
直到对象请求发作一个实例才实行实例化;这类要领称为“惰性实例化”。惰性实例化避免了在应用顺序启动时实例化不必要的 singleton。
2、线程的平安
public sealed class Singleton { static Singleton instance = null; private static readonly object padlock = new object(); private Singleton() { } public static Singleton Instance { get { lock (padlock) { if (instance == null) { instance = new Singleton(); } } return instance; } } }
评注:
同一个时刻加了锁的那部份顺序只要一个线程能够进入
对象实例由最早进入的谁人线程建立
厥后的线程在进入时(instence == null)为假,不会再去建立对象实例
增加了分外的开支,丧失了机能
3、两重锁定
public sealed class Singleton { static Singleton instance = null; private static readonly object padlock = new object(); private Singleton() { } public static Singleton Instance { get { if (instance == null) { lock (padlock) { if (instance == null) { instance = new Singleton(); } } } return instance; } } }
评注:
多线程平安
线程不是每次都加锁
许可实例化延晚到第一次接见对象时发作
4、静态初始化
public sealed class Singleton { private static readonly Singleton instance = null; static Singleton() { instance = new Singleton(); } private Singleton() { } public static Singleton Instance { get { return instance; } } }
评注:
依靠大众言语运行库担任处理变量初始化
大众静态属性为接见实例供应了一个全局接见点
对实例化机制的掌握权较少(.NET代为完成)
静态初始化是在 .NET 中完成 Singleton 的首选要领
小注:
静态组织函数既没有接见修饰符,C#会自动把他们标记为private,之所以必需标记为private,
是为了阻挠开发人员写的代码挪用它,对它的挪用老是由CLR担任的。
5、耽误初始化
public sealed class Singleton { private Singleton() { } public static Singleton Instance { get { return Nested.instance; } } public static void Hello() { } private class Nested { internal static readonly Singleton instance = null; static Nested() { instance = new Singleton(); } } }
评注:
初始化事情由Nested类的一个静态成员来完成,如许就完成了耽误初始化。
由于静态函数的挪用机遇,是在类被实例化或许静态成员被挪用的时刻举行挪用,并且是由.net框架来挪用静态组织函数来初始化静态成员变量, 所以,假如根据写法四来写,再挪用Hello要领的时刻,就会实例化出来Singleton实例,这不是我们想看到的,由于我们有能够只是想用Hello要领,而不是别的。
注意事项:
1、Singleton形式中的实例组织器能够设置为protected以许可子类派生。
2、Singleton形式平常不要支撑ICloneable接口,由于这能够会致使多个对象实例,与Singleton形式的初志违犯。
3、Singleton形式平常不要支撑序列化,由于这也有能够致使多个对象实例,一样与Singleton形式的初志违犯。
4、Singletom形式只斟酌到了对象建立的治理,没有斟酌对象烧毁的治理。就支撑垃圾接纳的平台和对象的开支来说,我们平常没有必要对其烧毁举行特别的治理。
总结:
1、Singleton形式是限定而不是革新类的建立。
2、明白和扩大Singleton形式的中心是“怎样掌握用户运用new对一个类的组织器的恣意挪用”。
3、能够很简朴的修正一个Singleton,使它有少数几个实例,如许做是许可的而且是有意义的。
以上就是单例形式及罕见写法剖析(设想形式01)的内容,更多相关内容请关注ki4网(www.ki4.cn)!