单例模式下,一个类只能有一个对象。
实现要点:
1. 隐藏构造方法.
2. 在该类中定义一个静态, 隐藏的该类的实例.
2. 提供一个静态方法来访问这个唯一的对象.
假设有一个King(国王)类, 而且只能有一个King对象, 代码如下:
package mjn.design.singleton; /** * singleton demo * the object of King is created as long as * the application is started. * @author MJN * @date 2011-10-05 */ public class King { private String name; /* other attributes */ private static King king = new King(); /** Don't let anyone else instantiate this class */ private King() {} public static King getKing() { return king; } /* other methods */ }
写一个测试类:
package mjn.design.singleton; public class Test { public static void main(String[] args) { King king1 = King.getKing(); King king2 = King.getKing(); if (king1 == king2) { System.out.println("same"); } else { System.out.println("not same"); } } }
输出结果是"same", 说明引用king1和king2指向同一对象. 如果用new King()来创建一个King实例, 则会提示无该构造方法, 因为我们隐藏了该方法.
上述King的实例在程序启动时创建, 若要延迟创建, 仅在第一次调用getKing()方法时才创建该实例, 则可以用下面的代码:
package mjn.design.singleton; /** * singleton demo * the object of King1 is created when * the method getKing1() is called. * @author MJN * @date 2011-10-05 */ public class King1 { private String name; /* other attributes */ private static King1 king1; /** Don't let anyone else instantiate this class */ private King1() {} public static King1 getKing1() { if (king1 == null) { king1 = new King1(); } return king1; } /* other methods */ }
参考:
1. NNU姜老师课堂源码'java_course'
2. 《Java程序设计教程(第2版)》雍俊海 编著, 清华大学出版社
3. 尚学堂马士兵_设计模式之_工厂系列_01
4. source code of java.lang.Runtime