单例系列(1)--饿汉式单例

2020-02-19  本文已影响0人  爱折腾的程序猿

什么是单例?

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

单例介绍:

意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

优点:

1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。

2、避免对资源的多重占用(比如写文件操作)。

缺点:

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

代码实现(传统实现):

/**
 * 单例一:饿汉式
 * @author 爱折腾的程序猿
 * @version 1.0
 * @date 2019/12/27 16:57
 */
public class Singleton_01  {

    private static Singleton_01 instance = new Singleton_01();

    private Singleton_01() {

    }

    public static Singleton_01 getInstance() {
        return instance;
    }

}

什么是序列化?

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

什么是序列化不安全?

序列化不安全指的是,同一个序列化对象,反序列化生成的对象不一致,这样单例就失去了意义,同时也成为了序列化攻击的漏洞。

如何解决饿汉式单例序列化不安全?

 //解决序列化不安全
    private Object readResolve(){
        return instance;
    }

解决序列化不安全(饿汉式升级版)

 import java.io.Serializable;
/**
 * 单例一:饿汉式
 * @author 爱折腾的程序猿
 * @version 1.0
 * @date 2019/12/27 16:57
 */
public class Singleton_01 implements Serializable {

    private static Singleton_01 instance = new Singleton_01();

    private Singleton_01() {

    }

    public static Singleton_01 getInstance() {
        return instance;
    }

    //解决序列化不安全
    private Object readResolve(){
        return instance;
    }

}

饿汉式单例总结

一句话总结单例:

单例类在整个程序中只有一个实例,这个类负责创建自己的对象,并确保只有一个对象被创建

代码实现三个要点:

a) 私有构造器
b) 持有该类的属性
c) 对外提供获取实例的静态方法

传统饿汉式:

线程安全、反射不安全、反序列化不安全

升级后的饿汉式:

线程安全、反射不安全、反序列化安全

如何判断反射是否安全

反射安全:通过反射创建的对象是同一个对象
反射不安全:通过反射创建的对象是不同对象

如何判断反序列化是否安全

反序列化安全:通过反序列化创建的对象是同一个对象
反序列化不安全:通过反序列化创建的对象是不同对象

下节预告:下节讲述登记式单例的具体实现

上一篇 下一篇

猜你喜欢

热点阅读