单例模式

单例模式的介绍

是Java中最简单的设计模式之一,属于创建型模式,提供了创建对象的最佳方式,,这个模式呢,按照我的理解就是,一个类,自己负责创建自己的对象,并且还要确保只能有一个对象被创建,这个类提供一种访问其唯一的对象方式,,
注:
1、单例类只能有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须对其他所有对象提供这一实例

上代码

public class Boos {

    private Boos() {
        //私有化构造方法/确保只有自己能创建对象
        System.out.println("一个Boss对象被实例化");
    }
    
    //存储实例对象
    private static Boos Instance = null; 

    //对外提供获取实例的方法
    
    public static Boos getBoos() {
        //确保实例唯一
        if (Instance == null) {
            Instance = new Boos();
        }
        return Instance;
    }
    
}

单例模式,主要是用来解决,一个全局使用的类频繁创建与销毁,比如我们的jdbc操作、io操作时,,

单例模式的好处与坏处:

1、在内存里只有一个实例,减少内存的开销,尤其是频繁的创建和销毁对象,
2、避免了对资源的多重占用,(例如文件读写)

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

单例模式有好几种实现方式,结合昨天的多线程,提到线程,上面的代码,是最简单的模式,在多线程中,他并不是真正的单例,也就是说,普通的单例模式,在多线程中不安全

升级模式1、懒汉式,线程安全

是否 Lazy 初始化:是
是否多线程安全:是
描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。

优点:第一次调用才初始化,避免内存浪费。
缺点:必须加锁 synchronized 才能保证单例,但加锁会影响效率。
getBoos() 的性能对应用程序不是很关键(该方法使用不太频繁)。

public class Boos {

    private Boos() {
        //私有化构造方法/确保只有自己能创建对象
        System.out.println("一个Boss对象被实例化");
    }


    //存储实例对象
    private static Boos boos = null;
    
    //对外提供获取实例的方法
    //使用synchronized修饰,确保多线程安全
    public static synchronized Boos getBoos() {
        //确保实例唯一
        if (Instance == null) {
            Instance = new Boos();
        }
        return Instance;
    }

}

升级模式2 饿汉式

是否 Lazy 初始化:否
是否多线程安全:是
描述:这种方式比较常用,但容易产生垃圾对象。

优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。

它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。

public class Boos {  
    private static Boos instance = new Boos();  
    private Boos (){
         System.out.println("一个Boss对象被实例化");
    }  
    
    public static Singleton getBoos() {  
    return instance;  
    }  
}

推荐使用 第二中升级模式哦

posted @ 2021-03-14 16:38  万能工具人  阅读(36)  评论(0)    收藏  举报