spider

导航

 

单例模式是设计模式中最常用的设计模式之一。单例模式有<懒汉模式>和<饿汉模式>,他们有各自的优缺点,在设计过程中要合理选择,不然将会造成严重的后果。

接下来我们先看<饿汉模式> ——所谓<饿汉模式>就是我们将在需要使用该类的对象时进行创建,上代码

 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.频繁访问数据库或文件的对象。



posted on 2019-04-25 11:52  黑色spider  阅读(204)  评论(0编辑  收藏  举报