单例模式是设计模式中最常用的设计模式之一。单例模式有<懒汉模式>和<饿汉模式>,他们有各自的优缺点,在设计过程中要合理选择,不然将会造成严重的后果。
接下来我们先看<饿汉模式> ——所谓<饿汉模式>就是我们将在需要使用该类的对象时进行创建,上代码
1 // <懒汉模式> 2 class Myclass { 3 // 第一步,私有化构造方法,禁止在外部创建对象 4 private Myclass() { 5 6 } 7 // 第二步, 声明该对象 8 static Myclass myclass; 9 // 第三步,创建一个获得实例的静态方法 10 public static Myclass Getinstance() { 11 if (myclass == null ) { 12 myclass = new Myclass(); 13 } 14 return myclass; 15 }
优点:能够在需要使用该类时创建对象,不需要用到时将不会创建,节省了系统资源
缺点:在多线程中,如果两个线程同时需要该类的对象,将会造成创建了被创建了两个对象,这是个非常严重的问题,这便是局限之处
使用:在单线程中我们将可以使用<懒汉模式>来构建单例模式。
在一些单线程程序开发中,我们可以将一个管理类(manage)构建成单例模式,对于这类管理类,程序一开始运行就会被创建对象,所以这儿的单例模式就可以设计成<懒汉模式>。
然后是<饿汉模式>——所谓<饿汉模式>就是将会直接创建对象,不管是否将会用到该对象。上代码
1 // <饿汉模式> 2 class Myclass { 3 // 第一步,私有化构造方法,禁止在外部创建对象 4 private Myclass() { 5 } 6 // 第二步, 创建该对象 7 private static Myclass myclass = new Myclass(); 8 // 第三步,创建一个获得实例的静态方法 9 public static Myclass Getinstance() { 10 return myclass; 11 }
优点:在多线程中将不会被创建多个实例。
缺点:有时将不会用到该对象,则造成了系统资源的浪费。
看了这两种模式,是不是感觉都比较极端,接下来看 双重检查 来构建的单例模式,推荐使用,但并非完美,会受到指令重排的影响
1 <双重检查> 2 class Myclass { 3 // 第一步,私有化构造方法,禁止在外部创建对象 4 private Myclass() { 5 } 6 // 第二步, 创建该对象 7 private static Myclass myclass; 8 // 创建一个只读object对象 9 private static readonly object padlock = new object(); 10 // 第四步,创建一个获得实例的静态方法 进行两次判断 11 public static Myclass Getinstance() { 12 if (myclass == null ) { 13 lock (padlock) { 14 if (myclass == null ) { 15 myclass = new Myclass(); 16 } 17 } 18 } 19 return myclass; 20 }
还有一种方法 静态内部类,推荐使用
class Myclass { // 第一步,私有化构造方法,禁止在外部创建对象 private Myclass() { } // 第二步, 创建静态类 private static class manage { public static readonly Myclass myclass = new Myclass(); } // 第三步,创建一个获得实例的静态方法 public static Myclass Getinstance() { return manage.myclass; }
那我们在哪些场合可以使用单例模式呢?
1.创建工具类对象时;
2.需要经常销毁或创建的对象
3.创建对象时耗时过多或耗费资源过多,但又经常用到的对象;
4.频繁访问数据库或文件的对象。