面向对象设计模式之单例模式

2020-01-07  本文已影响0人  严中辉

单例对象的类必须保证只有一个实例存在。

饿汉模式

/**
 * 饿汉模式
 */
public class HungrySingleton {
    private static final HungrySingleton INSTANCE = new HungrySingleton();

    private HungrySingleton() {
    }

    public static HungrySingleton getInstance() {
        return INSTANCE;
    }

}

懒汉模式

/**
 * 懒汉模式
 */
public class LazySingleton {
    private static LazySingleton INSTANCE = null;

    private LazySingleton() {
    }

    public static synchronized LazySingleton getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new LazySingleton();
        }
        return INSTANCE;
    }

}

Double Check Lock(DLC)实现单例

/**
 * Double Check Lock(DLC)实现单例
 */
public class SingletonDCL {
    private static volatile SingletonDCL INSTANCE = null;

    private SingletonDCL() {
    }

    public static SingletonDCL getInstance() {
        if (INSTANCE == null) {
            synchronized (SingletonDCL.class) {
                if (INSTANCE == null) {
                    INSTANCE = new SingletonDCL();
                }
            }
        }
        return INSTANCE;
    }

}

静态内部类单例模式

/**
 * 静态内部类单例模式
 */
public class Singleton {

    public Singleton() {
    }

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

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

}

枚举单例

/**
 * 枚举单例
 */
public enum SingletonEnum {
    INSTANCE;

    public void doSomething() {

    }

}

杜绝单例对象在反序列化时重新生成对象

/**
 * 杜绝单例对象在反序列化时重新生成对象
 */
public final class SingletonSerializable implements Serializable {
    private static final long serialVersionUID = 0L;
    private static final SingletonSerializable INSTANCE = new SingletonSerializable();

    private SingletonSerializable() {
    }

    public static SingletonSerializable getInstance() {
        return INSTANCE;
    }

    private Object readResolve() throws ObjectStreamException {
        return INSTANCE;
    }

}

使用容器实现单例模式

/**
 * 使用容器实现单例模式
 */
public class SingletonManager {
    private static Map<String, Object> objectMap = new HashMap<>();

    public SingletonManager() {
    }

    public static void registerService(String key, Object instance) {
        if (!objectMap.containsKey(key)) {
            objectMap.put(key, instance);
        }
    }

    public static Object getService(String key) {
        return objectMap.get(key);
    }

}
上一篇 下一篇

猜你喜欢

热点阅读