单例设计模式,比较简单推荐饿汉式。

107 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、介绍

  • 保证类在内存中,只有一个对象

  • 举例:

    • Windows任务管理器
    • 回收站
    • 网站的计数器对象:例如点赞

    二、饿汉式:

    1. 私有化构造方法 2. 定义一个 public static final 修饰的常量,常量值就是对象 3. 在外界直接调用这个常量

写法一:

代码示例

public class Single {
    //1.私有化构造方法 --- 不让别人创建对象
    private Single(){}
    
    // 非常饿, 上来就要吃, 上来不看任何条件, 直接创建对象

    //2.在本类中,自己创建对象
    public static final Single s = new Single();
}

写法二、

  1. 私有化构造方法
  2. 定义一个 private static final 修饰的常量,常量值就是对象
  3. 再定义一个getInstance方法
  4. 在外界直接调用方法即可 代码示例:
public class Single {
    //1.私有化构造方法 --- 不让别人创建对象
    private Single(){}

   //把这个变量定义为私有
    private static final Single s = new Single();

    public static Single getInstance() {
        return s;
    }
}

三、懒汉式

写法一:弊端:多线程操作的时候,很有可能会创建出多个对象

 public class Single {
    
    private Single(){}

    // 懒汉式
    // 核心:延迟加载
    private static Single s;

    public static Single getInstance() {  
        if(s == null){
            s = new Single();
        }
        return s ;
    }
}

写法二、添加同步代码块

public class Single {

    private Single(){}

    private static Single s ;

    public static Single getInstance() {   

        synchronized (Single.class) {
        
             	if(s == null){
       
                    s = new Single();
                }
            }
        }
        return s ;
    }
}

写法三: 会进行判断当前是否创建了对象,如果没创建过对象,就进行加锁

public class Single {

    private Single(){}

    private static Single s ;

    public static Single getInstance() {   
        // 如果现在对象已经有了,而且,锁关闭了
        // 为了提高代码的效率,所以,我们要在外面,再加一个非空判断
        if(s == null){ // 作用:提高效率
            synchronized (Single.class) {
                if(s == null){ // 作用:保证唯一
                    s = new Single();
                }
            }
        }
        return s ;
    }
}

推荐饿汉式、、和懒汉式第三种写法。