单例模式及其用法

  • 什么是单例模式

  • :Java中单例(Singleton)模式是一种广泛使用的设计模式。单例模式的主要作用是保证在Java程序中,某个类只有一个实例存在。一些管理器和控制器常被设计成单例模式。

  • 为什么使用单例模式

  •  单例模式有很多好处,它能够避免实例对象的重复创建,不仅可以减少每次创建对象的时间开销,还可以节约内存空间;能够避免由于操作多个实例导致的逻辑错误。如果一个对象有可能贯穿整个应用程序,而且起到了全局统一管理控制的作用,那么单例模式也许是一个值得考虑的选择。

  • 单例模式的特点

    1. 单例类只能有一个实例。

    2. 单例类必须自己创建自己的唯一实例。

    3. 单例类必须给所有其他对象提供这一实例。

  • 单例模式有很多种写法,大部分写法都或多或少有一些不足。下面将分别对这几种写法进行介绍:

  • 饿汉模式(常用)

    • 代码:

      public class Singleton{     private static Singleton instance = new Singleton();  

    •    private Singleton(){

          }  
          public static Singleton newInstance(){  
              return instance;  
          }  
      }
    • 优缺点:

      • 优点:

        1. 从代码中我们看到,类的构造函数定义为private的,保证其他类不能实例化此类,然后提供了一个静态实例并返回给调用者。

        2. 饿汉模式是最简单的一种实现方式。

        3. 只在类加载的时候创建一次实例,不会存在多个线程创建多个实例的情况,避免了多线程同步的问题。

      • 缺点:即使这个单例没有用到也会被创建,而且在类加载之后就被创建,内存就被浪费了。

      • 适用场合:这种实现方式适合单例占用内存比较小,在初始化时就会被用到的情况。但是,如果单例占用的内存比较大,或单例只是在某个特定场景下才会用到,使用饿汉模式就不合适了。

  • 懒汉模式

    • 代码:

      • 普通模式(线程不安全):

        • 代码:

          public class Singleton{    

        •  private static Singleton instance = null;    

        •  private Singleton(){}   

        •   public static Singleton newInstance(){        

        •  if(null == instance){          

        •    instance = new Singleton();         }     

        •     return instance;     } }

        • 优缺点:

          • 优点:懒汉模式中单例是在需要的时候才去创建的,如果单例已经创建,再次调用获取接口将不会重新创建新的对象,而是直接返回之前创建的对象。

          • 缺点:但是这里的懒汉模式并没有考虑线程安全问题,在多个线程可能会并发调用它的getInstance()方法,将导致创建多个实例。

          • 使用场合:如果某个单例使用的次数少,并且创建单例消耗的资源较多,那么就需要实现单例的按需创建,这个时候使用懒汉模式就是一个不错的选择。

你可能感兴趣的:(java,设计模式)