Singleton指仅仅被实例化一次的类。
例如:文件系统,数据库连接,窗口管理器等
在Java 1.5之前,实现Singleton有两种方法,这两种方法都要把构造器保持为私有的,下面直接贴实例代码,应该都能看懂:
第一种:
需要获取的公有静态成员(需要实现Singleton的对象)是个final域
public class DataBaseSource{
public static final DataBaseSource INSTANCE = New DataBaseSource();
private DataBaseSource(){...}
//省略其余代码
}
第二种:
需要获取的公有的成员(需要实现Singleton的对象)是个静态工厂方法
public class UtillA{
public static final DataBaseSource INSTANCE = New DataBaseSource();
private DataBaseSource(){...}
public static DataBaseSource getInstance(){return INSTANCE;}
//省略其余代码
}
从Java 1.5发行版本开始。采用单元素的枚举类型已经成为实现Singleton的最佳方法
为什么?
因为这样的写法更加简洁,无偿提供了序列化机制,绝对防止多次实例化,即使在面对复杂的序列化或者反射攻击的时候也可以。
只需要编写一个包含单个元素的枚举类型:
public enum DataBaseSource{
INSTANCE;
private DataBaseSource(){...}
public void method1(){
//省略方法实现
}
public void method2(){
//省略方法实现
}
}
//如何调用?
public class Test {
public static void main(String[] args) {
DataBaseSource.INSTANCE.method1();
DataBaseSource.INSTANCE.method2();
}
}