单例模式约束一个类只能实例化一个对象。在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