设计模式--单例模式

1. 概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 代码解析

  1. 查看博主写的优雅单例模式

3. 破坏单列模式

  1. 序列化和反序列化
    会得到不同的对象;反序列化的时候,是通过反射重新获取了一个新的实例。
public class HungerSingleton implements Serializable {

    private final static HungerSingleton HUNGER_SINGLETON = new HungerSingleton();

    private HungerSingleton() {    }

    public static HungerSingleton getInstance() {
        return HUNGER_SINGLETON;
    }
    /**
     * 使用这个方法, 来保证序列化之后, 不会获取反射得到的对象;
     * 1. 读取Object: {@link ObjectInputStream#readObject();}
     * 2. 判断读取的是什么类型的对象: {@link ObjectInputStream#readObject0}
     * 3. {@link ObjectInputStream#readOrdinaryObject}: 通过反射生成对象, 检测对象类中是否包含'readResolve'方法; 
     *  若无此方法, 返回反射得到的对象; 否则, 返回对象类中的readResolve方法的返回值.
     */
    public Object readResolve() {
        return HUNGER_SINGLETON;
    }
}


public class HungerSingletonTest {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        HungerSingleton hungerSingleton = HungerSingleton.getInstance();

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("hunger"));
        oos.writeObject(hungerSingleton);

        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("hunger"));
        HungerSingleton newInstance = (HungerSingleton) ois.readObject();

        System.out.println(hungerSingleton);
        System.out.println(newInstance);
        System.out.println(newInstance == hungerSingleton);
    }
}
  1. 反射

    1. 反射可以获取到构造函数,因此,可以实例化对象。
    2. 防护:就是在私有构造方法中,验证是否已经存在实例化的对象,存在则抛出异常;
  2. 克隆

    1. 通过反射调用clone方法, 可以获得实例化对象。
    2. 防护:clone方法中调用getIntance方法,而不是clone一个新的对象处理。

4. 源码应用

  1. JDK中RunnTime类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值