设计模式--------单例模式

单例设计模式

  1. 单例模式: 一个类只能有一个对象实例,且由该类能自行创建这个实例的实例

单例模式的特点

  1. 一个类只有一个实例对象
  2. 唯一的实例对象有这个单例类来创建
  3. 单例类为对外提供一个访问该类的全局访问点

单例模式的几种实现方式(附代码)

     1. 懒汉模式:

   懒汉模式线程不安全,延迟加载,不是实际意义的上的单例模式

public class Singleton {
    private static Singleton instance;
    private Singleton (){}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    } 
 }

    2. 饿汉模式

   线程安全,比较常用,但是容易比较产生垃圾,因为一开始就进行初始化

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

    3. 双重锁模式

  线程安全,延迟初始化。这种方式采用双锁机制,安全且在多线程情况下能保持高性能。

public class Singleton {
    private volatile static Singleton singleton;
    private Singleton (){}
    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }  
}

    4. 静态内部类

只有第一次调用getInstance方法时,虚拟机才加载 Inner 并初始化instance ,只有一个线程可以获得对象的初始化锁,其他线程无法进行初始化,保证对象的唯一性。

public class Singleton {
    private Singleton(){
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
    private static class Inner {
        private static final Singleton instance = new Singleton();
    } 
 }

4. 单例模式的应用场景 

 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例。

on {
    private Singleton(){
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
    private static class Inner {
        private static final Singleton instance = new Singleton();
    }

 }

public class Singleton {
    private Singleton(){
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
    private static class Inner {
        private static final Singleton instance = new Singleton();
    }

 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章