• JAVA设计模式之单例模式


    单例模式:整个应用中保证只有一个类的实例存在。比如打印缓冲池和文件系统等。

    于是我们很容易想到可以把类的构造函数写成私有的,然后提供方法可以返回一个静态的实例。

    写法一:

     1 package designPattern;
     2 
     3 public class SingletonClass 
     4 {
     5       private static final SingletonClass instance = new SingletonClass();
     6         
     7       public static SingletonClass getInstance() 
     8       {
     9           return instance;
    10       }
    11         
    12       private SingletonClass() 
    13       {
    14 
    15       }
    16 }

    评价:只要加载这个类,即使没有使用过,实例也会被创建。(这个缺点其实挺勉强的,既然创建了这个类为什么不使用呢?)

    写法二:

     1 package designPattern;
     2 
     3 public class SingletonClass 
     4 {
     5     private static SingletonClass instance = null;
     6     
     7     public synchronized static SingletonClass getInstance()
     8     {
     9         if(instance == null)
    10         {
    11             instance = new SingletonClass();
    12         }
    13         return instance;
    14     }
    15     
    16     private SingletonClass()
    17     {
    18         
    19     }
    20 }

    评价:调用的时候再创建实例,但由于步骤的分离,为了线程安全需要加上同步化的关键字,同步化会让程序效率变低。

    写法三:

     1 package designPattern;
     2 
     3 public class SingletonClass 
     4 {
     5     private volatile static SingletonClass instance = null;
     6     
     7     public static SingletonClass getInstance()
     8     {
     9         if(instance == null)
    10         {
    11             synchronized(SingletonClass.class)
    12             {
    13                 if(instance == null)
    14                 {
    15                     instance = new SingletonClass();
    16                 }
    17             }
    18         }
    19         return instance;
    20     }
    21     
    22     private SingletonClass()
    23     {
    24         
    25     }
    26 }

    评价:在写法二的基础上,只有instance == null的时候才加锁,所以提高了效率,但是感觉代码略显冗余。

    写法四:

     1 package designPattern;
     2 
     3 public class SingletonClass 
     4 {
     5     private static class SingletonClassInstance
     6     {
     7         private static final SingletonClass instance = new SingletonClass();
     8     }
     9     
    10     public static SingletonClass getInstance()
    11     {
    12         return SingletonClassInstance.instance;
    13     }
    14     
    15     private SingletonClass()
    16     {
    17         
    18     }
    19 }

    评价:在类的内部多实现了一个静态类,只在调用的时候才会创建实例,且不需要同步化,比较推荐使用。

  • 相关阅读:
    gdb调试
    go pipeline
    Go的Timer
    goconvey
    购物
    Go的可行测试
    可能会停止一段时间的更新
    一些blog
    linux全套 | Python开发平台_Ubuntu | 15
    Python基础 | 配置pip镜像源 | 01
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/5499293.html
Copyright © 2020-2023  润新知