23种设计模式——单例模式(枚举类实现)

一、枚举实现单例模式优势

单例模式约束一个类只能实例化一个对象。在Java中,为了强制只实例化一个对象,最好的方法是使用一个枚举量。这个优秀的思想直接源于Joshua Bloch的《Effective Java》

这里有几个原因关于为什么在Java中宁愿使用一个枚举量来实现单例模式:

1、 自由序列化;

2、 保证只有一个实例(即使使用反射机制也无法多次实例化一个枚举量);

3、 线程安全;

4、传统的单例模式的另外一个问题是一旦你实现了serializable接口,他们就不再是单例的了,因为readObject()方法总是返回一个 新的实例对象,就像java中的构造器一样;

二、示例代码


/**
 * 
 * Example of a Java Singleton.
 * It is suggested to use an enum as a singleton. The Class
 * cannot be instantiated more then once, specifically when
 * using reflection.
 * 
 * Details determine success.
 * by Liang ZC., Phd@Stanford
 *
 * @author LIANGZHICHENG
 * @date 2019-8-26 10:22
 * @see http://www.stanford.edu
 */
public enum SlotTypeSingleton {

    /**
     * interface
     */
    INSTANCE;

    private SlotTypeSingleton() {

    }

    /**
     * Build the slot type list.
     *
     * @return {@link SlotTypeEnum[]}
     */
    public SlotTypeEnum[] buildSlotTypeList() {

        final SlotTypeEnum[] animals = new SlotTypeEnum[6];

        animals[0] = SlotTypeEnum.RECALL;
        animals[1] = SlotTypeEnum.ROUGH_SORT;
        animals[2] = SlotTypeEnum.REFINED_SORT;
        animals[3] = SlotTypeEnum.RULE;
        animals[4] = SlotTypeEnum.FEED;
        animals[5] = SlotTypeEnum.ILLEGAL_SLOT;

        return animals;
    }

}

三、运行代码

/**
 * Details determine success.
 * by Liang ZC., Phd@Stanford
 *
 * @author LIANGZHICHENG
 * @date 2019-8-26 10:30
 * @see http://www.stanford.edu
 */
public class TestRun {

    public static void main(String[] args) {

        //Call singleton to build the animal list.
        SlotTypeEnum[] slotTypeEnums = SlotTypeSingleton.INSTANCE.buildSlotTypeList();

        for (SlotTypeEnum slotTypeEnum : slotTypeEnums) {
            System.out.println(slotTypeEnum);
        }
    }
    
}

关于单列模式的使用,请不要过分地使用它们,但是当你需要使用的时候,使用枚举量是最佳的方法。

你可能感兴趣的:(设计模式)