`
chenhuachong
  • 浏览: 2873 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

Effective Java 学习 第三条 用私有构造器或者枚举类型强化Singleton属性

 
阅读更多

综述: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");
    }
}

特点:懒加载,线程安全

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics