package _1Singleton;
public class Singleton {
private static Singleton singleton = new Singleton(1);
private Singleton(int i)
{
System.out.println(i);
}
/**
* Solution 1
* 在调用本类任何参数或方法时,singleton都将被实例化
*
* @return
*/
public static Singleton getInstance()
{
return singleton;
}
/**
* Solution 2
* 在第一次调用的时候实例化,但是需要同步的开销
*
* @return
*/
public static Singleton getInstance2() {
if(singleton == null) {
synchronized(Singleton.class) {
if(singleton == null) {
singleton = new Singleton(2);
}
}
}
return singleton;
}
/**
* Solution 3
* 在第一次调用的时候实例化,不需要同步
*
* @return
*/
public static Singleton getInstance3()
{
return SingletonHolder.instance;
}
/**
* @param args
*/
public static void main(String[] args) {
Singleton.getInstance();
}
private static class SingletonHolder
{
private static Singleton instance = new Singleton(3);
}
}
上面列举了三种单例模式的实现方式,当然方案一是最简单的,建议使用。
单例的优点:
- 减少内存开销
- 减少系统性能开销
- 避免对资源的多重占用
- 单例模式可以在系统设置全局的访问点,优化和共享资源访问(例如一个单例类用来负责所有数据表的映射处理
单例的缺点:
- 单例模式一般没有接口,不容易扩展,功能改动时基本上只能修改代码
- 如果单例没有完成,无法进行测试工作
- 单例模式与单一职责原则有冲突。
- 需要保证线程安全
单例的应用场景:
- 要求省城唯一序列号的环境
- 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面的访问计数器
- 创建一个对象需要消耗的资源过多,如访问IO和数据库等资源
- 需要定义大量的静态常量和静态方法(如工具类)的环境