设计模式之单例模式

在写Spring Boot 2.0.2-webmvc源码分析系列的文章时,当时提到了Servlet单例模式。所以就想着写一篇文章来介绍以下单例模式,其实网上类似这种设计模式的文章很多,23种设计模式大家可能都看过,早些时候自己也都看过,基本上只对常用的几种印象比较深刻,其余不常用的差不多都忘记了。既然提到了单例模式,那就仔细介绍一下。再加深一下印象。

单例模式定义:

单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例。

我觉得学习设计模式,主要可以从以下四个方面着手。

1、该设计模式的一般使用场景。
2、该设计模式的实现。
3、该设计模式主要解决的问题及优点。
4、该设计模式的不足之处。

单例模式的一般使用场景,下面列举常见的几种:

1、一般的应用系统都有一个或多个属性文件存放系统配置,这样的应用可以使用一个单例对象来管理这些属性文件 。
2、 网站的计数器,一般可以使用单例模式实现,不然数据很难同步。
3、系统的日志应用,一般可以使用单例模式实现,由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
4、应用的配置信息读取,一般也使用单例模式,由于配置文件是共享的资源。为了保证数据的唯一性,可以使用单例对象进行获取。
5、线程池的设计一般也是采用单例模式,由于线程池要对池中的线程进行控制。

下面简单列举一下使用单例模式的优点。

1、 由于单例模式在内存中只有一个实例,所以一定程度上可以减少内存消耗,特别是一个对象需要频繁地创建销毁时,会影响系统的性能,使用单例模式就非常明显了。
2、由于单例模式只生成一个实例,当一个对象实例需要比较多的资源时,如读取配置信息,则可以通过在应用启动时直接产生一个单例对象,然后放入内存的方式来优化。
3、单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。
4、单例模式可以在系统设置全局的访问点,优化和共享资源访问。

除了优点之外,当然也还有一些不足:

1、单例模式没有接口,如果需要扩展,每次都得改代码。
2、使用的场景比较单调,如果是在多场景不断变化的实例对象最好不要使用单例,数据容易出问题。

下面简单介绍以下实现方式,单例模式的实现方式有多种,不同的实现方式有不同的优缺点,这里介绍一种生产环境中常用的实现方式(静态内部类实现),其它几种方式也不建议使用,所以就不一一列举了,掌握下面这种就够用了。

public class Singleton {
    
    private Singleton() { }
    
    public static Singleton getInstance(){
        return SingletonInstance.INSTANCE;
    }
    
    private static class SingletonInstance{
        static Singleton INSTANCE = new Singleton();
    }
}

使用上面这种单例模式的好处可以保证以下几点

1、Singleton最多只有一个实例,前提是在不考虑反射突破访问限制的情况下。
2、保证了即使在高并发情况下,也不会产生多个实例。
3、保证了在高并发情况下,不会访问到未初始化完成的对象造成系统异常问题。

你可能感兴趣的:(设计模式之单例模式)