Java实践之路(设计模式)——单例模式(Singleton)(更新)

来源:互联网 发布:姜思达人工智能辩论词 编辑:程序博客网 时间:2024/05/06 23:43

背景

以前写过单例模式的文章(http://blog.csdn.net/cyxlzzs/article/details/7078548),这里根据最新的理解重新写一下单例模式的设计,主要写两种我认为最好的实现方式

单例模式之内部类实现

这里直接先上代码,后面总结

class RepositoryClass{    private int num;    //数据    private static class RepositoryClassHolder{        private static RepositoryClass instance = new RepositoryClass();    }    private RepositoryClass(){    }    public static RepositoryClass getInstance(){        return RepositoryClassHolder.instance;    }    public void incrNum(){        num++;    }    public int getNum(){        return this.num;    }}

这里定义了一个数据仓库类,里面需要维护一个数量的字段num

单例模式之枚举实现

也是先上代码

enum RepositoryEnum{    instance;           //单例对象    private int num;    //数据    private RepositoryEnum(){}    public void incrNum(){        num++;    }    public int getNum(){        return this.num;    }}

该枚举的作用和上面的仓库类是一样的

测试代码

public static void main(String[] args){        RepositoryClass repositoryClass = RepositoryClass.getInstance();        println(repositoryClass.getNum());        repositoryClass.incrNum();        println(repositoryClass.getNum());        RepositoryClass repositoryClass1 = RepositoryClass.getInstance();        println(repositoryClass1.getNum());        repositoryClass1.incrNum();        println(repositoryClass.getNum());        println(repositoryClass1.getNum());        System.out.println("===============");        println(RepositoryEnum.instance.getNum());        RepositoryEnum.instance.incrNum();        println(RepositoryEnum.instance.getNum());    }    public static void println(int num){        System.out.println("num:"+num);    }

输出结果

num:0num:1num:1num:2num:2===============num:0num:1

总结对比

1、内部类实现的单例模式优点在于:懒加载,效率高,线程安全;缺点在于有些机制还是会破坏单例,比如序列化,反射和clone,当然可以有相应的机制来防止这些,可以在网上查一下解决的方法

2、枚举实现是jdk版本1.5以上才有的,但这种方式是实现单例模式的最好方式,推荐使用

0 0