现在的位置: 首页 > 综合 > 正文

单例模式

2013年06月15日 ⁄ 综合 ⁄ 共 1284字 ⁄ 字号 评论关闭

单例模式下,一个类只能有一个对象。

实现要点:

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

抱歉!评论已关闭.