Java枚举实现单例模式

来源:互联网 发布:面板数据的固定效应 编辑:程序博客网 时间:2024/05/16 08:53

         

        单例模式约束一个类只能实例化一个对象。在Java中,为了强制只实例化一个对象,最好的方法是使用一个枚举量。这个优秀的思想直接源于Joshua Bloch的《Effective Java》(《Java高效编程指南》)。如果你的藏书室里还没有这本书,请搞一本,它是迄今为止最优秀的Java书籍之一。

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

       1、 自由序列化;

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

       3、 线程安全;

/** * 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. *  * @author keaplogik */public enum AnimalHelperSingleton {    INSTANCE;    private AnimalHelperSingleton(){    }    public Animal[] buildAnimalList(){        final Animal[] animals = new Animal[10];        animals[0] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,                 "Dog", true, Color.GRAY);        animals[1] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,                 "Cat", true, Color.YELLOW);        animals[2] = new SimpleAnimal(Animal.AnimalClass.AMPHIBIAN,                "Frog", true, Color.GREEN);        animals[3] = new SimpleAnimal(Animal.AnimalClass.BIRD,                "Crow", true, Color.BLACK);        animals[4] = new SimpleAnimal(Animal.AnimalClass.BIRD,                "Cardinal", true, Color.RED);        animals[5] = new SimpleAnimal(Animal.AnimalClass.ARTHROPOD,                "Mantis", false, Color.GREEN);        animals[6] = new SimpleAnimal(Animal.AnimalClass.ARTHROPOD,                "Spider", false, Color.ORANGE);        animals[7] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,                 "Tiger", true, Color.ORANGE);        animals[8] = new SimpleAnimal(Animal.AnimalClass.MAMMAL,                 "Bear", true, Color.BLACK);        animals[9] = new SimpleAnimal(Animal.AnimalClass.BIRD,                 "Owl", true, Color.BLACK);        return animals;    }}
        如何使用:

//Call singleton to build the animal list.Animal[] animals = AnimalHelperSingleton.INSTANCE.buildAnimalList();

        关于单列模式的使用,请不要过分地使用它们,但是当你需要使用的时候,使用枚举量是最佳的方法。你可以从我发布在github上的Java Design Conceptsrepo库中获取其他相关代码。

        同时本文也和策略模式(StrategyPattern)一文相关。

原文链接

本文产生于个人工作学习笔记,转载请注明出处http://blog.csdn.net/horace20
4 2
原创粉丝点击