设计模式之单例模式

设计模式之单例模式

单例模式 Singleton Pattern.

定义:

Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且提供一个全局的公共方法能够访问到这个实例)

public class Singleton {
    private static final Singleton singleton = new Singleton;

    //构造函数私有化,防止创建多个对象
    private Singleton(){}
    
    public static Single getInstance() {
        return singleton;
    }
}

通过定义一个私有访问权限的构造函数,避免被其他类new出来一个对象。

Pros

由于单例模式在内存中只有一个实例,减少了内存开支,特别是一个对象需要频繁地创建、销毁时,而且创建或销毁时性能又无法优化,单例模式的优势就非常明显。

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

Cons

单例模式一般没有接口,扩展很困难。

使用场景

  • 要求生成唯一序列号的环境;
  • 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,可以不用把每次刷新都记录到数据库中,使用单例模式保持计数器的值,并确保是线程安全的;
  • 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。

注意事项

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

最佳实践

Spring中每个Bean默认就是单例的,Spring可以管理这些Bean的生命周期。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.什么是单例模式 单例模式的定义:确保一个类只有一个实例,并提供一个访问他的全局访问点。单例模式是几个设计模式中...
    Geeks_Liu阅读 2,248评论 0 10
  • 概述 单例模式是应用最广的模式之一,在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要...
    刘涤生阅读 1,048评论 0 5
  • 单例模式(Singleton Pattern)是最简单的一种设计模式。下面让我们开始学习单例模式。 一、基本介绍 ...
    冰鉴IT阅读 1,131评论 1 19
  • 1 单例模式的定义 定义:确保某一个类只有一个实例,自行实例化并且向整个系统提供这个实例。单例模式的通用类图如下所...
    Jerry_1116阅读 866评论 0 0
  • 夕阳西下,海平面上都是落日余晖的美。 我见到的真实的海上日落。 还记得那年我们一起看过的泰山日出,薄薄的雾挡住了日...
    共央阅读 663评论 2 9