zoukankan      html  css  js  c++  java
  • 23种设计模式之单例模式

    单例模式的定义

    定义: 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.

    单例模式的通用类图如下:

    1532136449933d868bb87c0 (422×188)

    单例模式的优缺点

    单例模式的优点:

    1. 由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁的创建、销毁时,而且创建和销毁时性能又无法优化,单例模式的优势就非常明显
    2. 由于单例模式只生成一个实例,所以减少了系统的性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式来解决(在Java EE中采用单例模式时需要注意JVM垃圾回收机制)
    3. 单例模式可以避免对资源的多重占用,例如一个写文件动作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作
    4. 单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如可以设计一个单例类,负责所有数据表的映射关系

    单例模式的缺点:

    1. 单例模式一般没有接口,扩展很困难,若要扩展,出来修改代码基本上没有第二种途径可以实现.
    2. 单例模式对测试是不利的.在并行开发环境中,如果单例模式没有完成,是不能进行测试的,没有接口也不能使用mock的方式虚拟一个对象
    3. 单例模式与单一职责原则有冲突. 一个类应该只实现一个逻辑,而不关心它是否是单例的,是不是要单例取决于环境,单例模式把"要单例"和业务逻辑融合在一个类中.

    单例模式的注意事项

    1.高并发情况下,注意线程同步问题

    这是一个线程不安全的单例

    1532139048769c926b52ada (532×292)

    该单例模式在低并发的情况下可能不会出现问题,若并发量增加就可能在内存中出现多个实例,破坏了最初的预期.

    解决线程不安全的方法有很多,可以在 getInstance 方法前加 synchronized 关键字,也可以在方法内增加 synchronized实现,这种被称为懒汉式单例,还有一种饿汉式单例,代码如下:

    1532139298344a0d6807cb8 (640×224)

    2.对象被复制的情况

    在Java中,对象默认是不可以被复制的,若实现了Cloneable接口,并实现了clone方法,则可以直接通过对象复制方式创建一个新对象,对象复制是不用调用类的构造函数的,因此即使是私有的构造函数,对象仍然可以被复制. 一般情况下,类复制的情况是不用考虑的,很少会出现一个单例类会主动要求被复制的情况,解决该问题的最好方法就是单例类不要实现Cloneable接口


    单例模式是23个模式中比较简单的模式,应用也很广泛,如在Spring中,每个Bean默认就是单例的,这样做的优点是Spring容器可以管理这些Bean的生命期,决定什么时候创建出来,什么时候销毁,销毁的时候要如何处理,等等.

  • 相关阅读:
    SZU:B47 Big Integer II
    Plan : 破晓
    C程序设计语言(第二版)习题:第二章
    Linux : fedora 安装 vnc server
    Linux系统编程:客户端-服务器用FIFO进行通信
    Linux系统编程:dup2()重定向
    Vijos: P1046观光旅游
    FLOYD 求最小环
    uva 401.Palindromes
    codeforces Educational Codeforces Round 5 A. Comparing Two Long Integers
  • 原文地址:https://www.cnblogs.com/hujingnb/p/10171534.html
Copyright © 2011-2022 走看看