- 单例模式的主要特点是使用一个实例,那为什么不使用静态类:
- 静态方法中产生的对象会在执行后被释放,被GC清理,不会一直存在于内存中,且静态方法会多次初始化和释放,占用资源
- 单例模式一般需要长存内存中,节约资源
- 静态一般用于全局范围访问,单例多见于工厂模式或者窗体等
- 枚举方式,较为推荐
- 枚举特点:不继承Object类,继承了Enum类,是一个抽象类;属性大写且必须位于前面;构造方法必须私有;可以和普通类一样实现普通方法
-
//单例 enum Singleton{ INSTANCE; public void otherMethods(){ //other codes } } //调用 Singleton.INSTANCE.otherMethods();
可以在这个枚举私有构造方法里面调用打印语句测试一次,不管执行多少次里面的方法始终只打印一次
-
双重校验锁法
public class BankDaoFactory {
private static volatile BankDaoFactory baf = null;
private BankDaoFactory() {
}
public static BankDaoFactory getInstance() {
if (baf == null) {//双重校验
synchronized(BankDaoFactory.class){
if(baf == null){//双重校验
baf=new BankDaoFactory();
}
}
}
return baf;
}
}
- 静态内部类实现
public class Singleton {
private static Holder{//静态内部类
private static Singleton instance=new Singleton();//需要采用单例的对象
}
private Singleton(){
System.out.println("Singleton has loaded");
}
public static Singleton getInstance(){
return Holder.instance;
}
//
}