综述:Singleton即单例模式是指仅仅被实例化一次的类。比如任务管理器、文件管理器、回收站、某些工具类等,这些类在程序中仅仅需要一个实例就足够了,这个时候可以考虑使用单例模式。,以下介绍三种实现单例模式的方法:
1.饿汉式(类加载时创建实例)
/**
* Created by luffy on 9/21/15.
* 方法一实现单例模式:使用静态常量来作为唯一的实例,保证该类只有一个实例
*/
public class Elvis01 {
public static final Elvis01 ELVIS_01 = new Elvis01();
private Elvis01(){
}
public void leaveTheBuilding(){
System.out.println("Elvis01 leaveTheBuilding");
}
}
特点:线程安全,不能防止反射攻击,序列化需要进行额外工作(实现Serializable)
2.饿汉变种(提供静态方法获取实例)
/**
* Created by luffy on 9/21/15.
* 方法二实现单例模式:通过提供静态方法获取该类的实例
*/
public class Elvis02 implements Serializable{
private static final Elvis02 elvis = new Elvis02();
private Elvis02(){
}
public void leaveTheBuilding(){
System.out.println("Elvis02 leaveTheBuilding");
}
public static Elvis02 getInstance(){
return elvis;
}
}
特点:线程安全,不能防止反射攻击,序列化需要进行额外工作(实现Serializable)
3.懒汉式
/**
* Created by luffy on 9/21/15.
* 方法三实现单例模式:懒汉式
*/
public class Elvis04 implements Serializable{
private Elvis04 instance;
private Elvis04(){
}
public Elvis04 getInstance(){
if(instance == null){
instance = new Elvis04();
}
return instance;
}
}
特点:懒汉式,线程不安全,序列化需要进行额外工作(实现Serializable),延时加载
4.枚举类型的单例模式
/**
* Created by luffy on 9/21/15.
* 方法四实现单例模式:使用枚举类型,保证线程安全
*/
public enum Elvis03 implements Serializable{
INSTANCE;
public void leaveTheBuilding(){
System.out.println("Elvis03 leaveTheBuilding");
}
}
特点:绝对防止多次实例化,即使是面对复杂的序列化活着反射攻击的时候。虽然这种方法还没有被广泛采用,但是单元素的枚举类型已经成为实现Singleton的最佳方法。
5.静态内部类
/**
* Created by luffy on 9/21/15.
* 方法五实现单例模式:静态内部类
*/
public class Elvis05 implements Serializable{
private Elvis05(){
}
public Elvis05 getInstance(){
return SignletonHolder.instance;
}
private static class SignletonHolder{
private static Elvis05 instance;
}
public void leaveTheBuilding(){
System.out.println("Elvis03 leaveTheBuilding");
}
}
特点:懒加载,线程安全
版权声明:本文为博主原创文章,未经博主允许不得转载。