初级程序员必知设计模式系列之单例模式

277 阅读2分钟

这是我参与 8 月更文挑战的第 2 天,活动详情查看: 8月更文挑战

1.单例模式是什么

Java种的单例模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。 顾名思义就是在Java程序中某个类只且只有一个对象。

2.单例模式有哪几种写法

单例模式根据加载时间可以分为饿汉式和懒汉式。 饿汉式是在类加载过程中就加载的,并不考虑是否用到该类的对象,而懒汉式是在需要用到某类的对象就加载的。

3.单例模式的JAVA实现代码

3.1 饿汉式

饿汉式的单例模式可以分为以下三种;
1.直接实例化
    public class Singleton1{
      /**
     * 1、构造器私有化
     * 2、自行创建,并且用静态变量保存
     * 3、向外提供实例
     * 4、强调这是一个单例,我们可以用final修改
     */
    private Singleton1() {

    }
    public static final Singleton1 INSTANCE = new Singleton1();
}
2.枚举方式
    /**
     * 枚举类型:表示该类型是有限的几个
     */
    INSTANCE
   private Singleton2 instance;
    SomeThing() {
        instance = new Singleton2 ();
    }
    public Resource getInstance() {
        return instance;
    }
   } 
3.静态块
public class Singleton3 {
/**
 *  静态代码块
 */
    public static final Singleton3 INSTANCE;
    private String info;

    static {
        try {
            INSTANCE = new Singleton3("123");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    private Singleton3(String info) {
        this.info = info;
    }
}

3.2 懒汉式

懒汉式的单例模式也可以分为两种;

1.线程不安全
    public class Singleton4 {
    /**
     * 1、构造器私有化
     * 2、用一个静态变量保存这个唯一的实例
     * 3、提供一个静态方法,获取这个实例对象
     */
    static Singleton4 instance;
    private Singleton4() {}

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

    }
}
2.线程安全
实现方式1:
    public class Singleton5 {
    /**
     * 1、构造器私有化
     * 2、用一个静态变量保存这个唯一的实例
     * 3、提供一个静态方法,获取这个实例对象
     */
    static Singleton5 instance;
    private Singleton5() {}

    public static Singleton5 getInstance() {
        if (instance == null) {
            synchronized (Singleton5.class) {
                if (instance == null) {
                    instance = new Singleton5();
                }
                return instance;
            }
        }
        return instance;
    }
}
实现方式2:
    public class Singleton6 {
    /**
     * 1、内部类被加载和初始化时,才创建INSTANCE实例对象
     * 2、静态内部类不会自动创建,随着外部类的加载初始化而初始化,他是要单独去加载和实例化的
     * 3、因为是在内部类加载和初始化时,创建的,因此线程安全
     */
    private Singleton6(){}

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

4.单例模式作用

减少不必要的内存开销;提高程序性能。