设计模式之单例模式

原创 2017年09月13日 15:13:13

1.定义
顾名思义,单例模式就是无论你有多少次创建,全局只能有一个该对象的实例
2.单例的几种写法
个人比较了解的有七种写法:

public class Singleton01 {

   private Singleton01(){}

   private static Singleton01 instance =new Singleton01();
    // 类被加载的时候就被初始化了,导致不必要的资源的浪费和时间的浪费

    public static Singleton01 getInstance(){
        return instance;
    }

}

public class Singleton02 {
    private Singleton02(){}
    private static Singleton02 instance;
    public static Singleton02 getInstance(){
        if(instance == null){//多线程不安全,多个线程同时访问 不能保证单例
            instance = new Singleton02();
        }
        return instance;
    }

}


public class Singleton03 {
    private Singleton03(){}

    private static Singleton03 instance;

    public synchronized static Singleton03 getInstance(){//能保证单例,但是太耗费资源,每次都要去获取整个对象的锁
        if(instance == null){
            instance = new Singleton03();
        }
        return instance;
    }

}


public class Singleton04 {//DCL

    private Singleton04(){}

    private static Singleton04 instance;

    public static Singleton04 getInstance(){
        if(instance == null){
            synchronized (Singleton04.class) {
                if(instance == null){
                    instance = new Singleton04();//出现内存的重排序  内存指向内存分配的地址,但是没有当前对象的引用,导致线程2进来时instance已经不为空
                }
            }
        }
        return instance;
    }
}

public class Singleton05 {

    private Singleton05(){}

    private volatile static Singleton05 instance;//不会出现内存重排序的,此关键字在内存中加入指令设置屏障,在写入副本时同时也刷新内存,这样导致副本和内存的数据一致

    public static Singleton05 getInstance(){
        if(instance == null){
            synchronized (Singleton05.class) {
                if(instance == null){
                    instance = new Singleton05();
                }
            }
        }
        return instance;
    }
}

public class Singleton06 {
    private Singleton06(){}
    private static class InnerClass{
    private final static Singleton06 instance = new Singleton06();//内部类的实现方式,比较优雅,在想初始化的时候初始化,又能保证线程的安全,反序列化的时候不能保证单例
    }
    public static Singleton06 getInstance(){
        return InnerClass.instance;
    }
}


public enum Singleton07 {
    INSTANCE;//能够保证单例,并且在反序列化的时候也能够保证是单例的
    private A instance;
    private Singleton07(){
        instance = new A();
    }
    public A getInstance(){
        return instance;
    }
}

3.单例模式的优缺点
优点:
1.全局只有一个实例,方便管理。
2.因为全局只有一个实例,可以节约资源,对于一些频繁创建和销毁资源的对象来说,这样大大的减少了资源的消耗。
3.可以允许生命的实例数。
缺点:
1.单例模式一般没有接口或者抽象类,不方便扩展,只能在代码中修改扩展。
2.对于持有的上下文为context时,非常容易造成内存泄漏,导致资源一直被占用。建议用applcationContext。

把自己学习设计模式的过程记成笔记,方便自己随时查看,如有错误,欢迎指出,谢谢!

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

相关文章推荐

Android设计模式(十二)-备忘录模式

备用录模式是一种行为型设计模式,用于保存对象当前的状态,以便之后可以再次恢复到此状态。备忘录模式要保证保存的对象状态不能被对象从外部访问,保护好被保存的这些对象状态的完整性以及内部实现不向外部暴露。定...

《Android源码设计模式解析与实战》读书笔记(十二)

第十二章、观察者模式 观察者模式是一个使用率非常高的模式,它最常用在GUI系统、订阅–发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间的依赖性更小,甚至做到毫无依...

设计模式学习之单例模式

  • 2013年12月11日 21:43
  • 5KB
  • 下载

23钟设计模式之单例模式

  • 2013年08月13日 10:41
  • 26KB
  • 下载

设计模式之———单例模式的问题及效率比较

目录 - 出现问题 - 问题展示及解决方法 - 不同单例模式的效率比较
  • lyyao09
  • lyyao09
  • 2016年09月29日 16:42
  • 659

设计模式之单例模式程序

  • 2010年05月18日 10:28
  • 3KB
  • 下载

java设计模式之单例模式详解

  • 2012年11月02日 17:53
  • 33KB
  • 下载

设计模式--单例模式【Singleton Pattern】

这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一、独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的...

设计模式单例模式

  • 2014年10月10日 20:56
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之单例模式
举报原因:
原因补充:

(最多只允许输入30个字)