类图
为什么使用单例模式
单例模式,顾名思义,只有一个实例,在整个服务中,该类只有一个实例。比如你想创建一个对象,用来保存整个服务的某一个内容,而你又想在其他地方使用保存的内容,那么使用单例模式是正好的。例如你想做一个计数器等等。。。
示例代码
package com.qiang;
/**
* 单例实体
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class Singleton {
private Singleton() {
}
private int num = 1000;
private static Singleton singleton = new Singleton();
public static Singleton getSingleton() {
return singleton;
}
public int getNum() {
return num++;
}
}
package com;
import com.qiang.Singleton;
/**
* 测试类
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class Test {
public static void main(String[] args) {
Singleton singleton = Singleton.getSingleton();
System.out.println(singleton.getNum());
Singleton singleton1 = Singleton.getSingleton();
System.out.println(singleton1.getNum());
Singleton singleton2 = Singleton.getSingleton();
System.out.println(singleton2.getNum());
}
}
结果
1000
1001
1002
尽管获取了多个实例,但是我们计数依然是按照猜想那样,并没有因为多个实例,而从新开始。
拓展
单例模式,还有其它的表现形式,上面的形式,也被称为『饿汉式』,接下来我在写一个『懒汉式』
示例代码
package com.qiang;
/**
* 懒汉式单例
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class SingletonTwo {
private static SingletonTwo singletonTwo = null;
private int num = 1000;
/**
* 使用了 synchronized 关键字
* 这是一种不严格的单例模式
* 尽量不要使用
*
* @return 对象
*/
public synchronized static SingletonTwo getSingletonTwo() {
if (null == singletonTwo) {
singletonTwo = new SingletonTwo();
}
return singletonTwo;
}
public int getNum() {
return num++;
}
}
package com;
import com.qiang.Singleton;
import com.qiang.SingletonTwo;
/**
* 测试类
*
* @author zhangxinqiang
* @date 01/04/2018
*/
public class Test {
public static void main(String[] args) {
// Singleton singleton = Singleton.getSingleton();
// System.out.println(singleton.getNum());
// Singleton singleton1 = Singleton.getSingleton();
// System.out.println(singleton1.getNum());
// Singleton singleton2 = Singleton.getSingleton();
// System.out.println(singleton2.getNum());
SingletonTwo singletonTwo = SingletonTwo.getSingletonTwo();
SingletonTwo singletonTwo1 = SingletonTwo.getSingletonTwo();
SingletonTwo singletonTwo2 = SingletonTwo.getSingletonTwo();
SingletonTwo singletonTwo3 = SingletonTwo.getSingletonTwo();
System.out.println(singletonTwo.getNum());
System.out.println(singletonTwo1.getNum());
System.out.println(singletonTwo2.getNum());
System.out.println(singletonTwo3.getNum());
}
}
结果
1000
1001
1002
1003
思考一下:为什么要用
synchronized