设计模式:单例模式

发布于 2021-04-17  1776 次阅读


1.懒汉式

/**
 * 懒汉式,线程不安全
 */
public class SingleObject {

    //创建 SingleObject 的一个对象
    private static SingleObject instance;

    //让构造函数为 private,这样该类就不会被实例化
    private SingleObject(){}

    //获取唯一可用的对象
    public static SingleObject getInstance(){
        if (instance==null){
            instance = new SingleObject();
        }
        return instance;
    }

    public void showMessage(){
        System.out.println("Hello World!");
    }
}

2.懒汉式

/**
 * 懒汉式,加锁保证安全,但是性能差
 */
public class SingleObject2 {
    //创建 SingleObject 的一个对象
    private static SingleObject2 instance2;

    //让构造函数为 private,这样该类就不会被实例化
    private SingleObject2(){}

    //加锁保证线程安全
    public static synchronized SingleObject2 getInstance(){
        if (instance2==null){
            instance2 = new SingleObject2();
        }
        return instance2;
    }

    public void showMessage(){
        System.out.println("Hello World!");
    }
}

3.饿汉式

/**
 * 饿汉式,浪费内存
 */
public class SingleObject3 {
    private static SingleObject3 instance3 = new SingleObject3();
    private SingleObject3(){}

    public static SingleObject3 getInstance(){
        return instance3;
    }

    public void showMessage(){
        System.out.println("Hello World!");
    }
}

4.静态内部类

/**
 * 静态内部类单例
 */
public class SingleObject5 {

        private static class SingletonHolder {
            private static final SingleObject5 INSTANCE = new SingleObject5();
        }
        private SingleObject5 (){}

        public static final SingleObject5 getInstance() {
            return SingletonHolder.INSTANCE;
        }
}

5.双重锁

/**
 * 双重锁懒汉式  volatile  防止内存重排,原子性加锁
 */
public class SingleObject4 {
    private volatile static SingleObject4 singleton;
    private SingleObject4 (){}
    public static SingleObject4 getSingleton() {
        if (singleton == null) {
            synchronized (SingleObject4.class) {
                if (singleton == null) {
                    singleton = new SingleObject4();
                }
            }
        }
        return singleton;
    }
}

6.枚举

/**
 * 枚举单例
 */
public enum SingleObject6 {
        // 唯一枚举:
    INSTANCE;

    private String name = "world";

    SingleObject6() {
        System.out.println("构造函数");
    }

    public String getName() {
            return this.name;
        }

        public void setName(String name) {
            this.name = name;
        }
}

欢迎欢迎~热烈欢迎~