单例模式是个非常简单的设计模式,设计目的就是使得目标类仅能创建一个实例。
需要实现这个设计目标我们需要做如下工作:
- 由于只能有一个实例,我们不能暴露默认的public构造方法(不能有任何一个public构造方法,即将默认的构造方法使用private隐藏起来),否则可以用new创建实例;
- 由于我们没有构造方法,我们需要通过一个静态的getInstance方法获得一个类的实例;
- 具体实现需要考虑到多线程的同步问题;
具体代码如下:
单例类:
package com.freesoft.designpattern.singleton;
public class Singleton {
// 保存唯一一份实例
private static Singleton instance = null;
// 隐藏默认构造方法,这样别人无法通过调用new Singleton()来创建对象实例
private Singleton() {
}
// 需要使得方法是同步方法,防止多线程同时调度时可能发生的问题
public static synchronized Singleton getInstance() {
if (null == instance) {
instance = new Singleton();
}
return instance;
}
}
测试类:
package com.freesoft.designpattern.singleton;
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
System.out.println(singleton);
// 如果是通过new创建的对象,打印出来的对象地址肯定是不一样的
// 这里一样说明通过getInstance方法得到的对象是同一个对象
singleton = Singleton.getInstance();
System.out.println(singleton);
}
}