破坏单例模式

破坏单例模式

单例模式,顾名思义,就是一个类在虚拟机中只能存在一个实例,那有没有什么方法可以破坏这个模式呢?看过下面的代码你就明白了,方法还不少哦。

直接上代码

/** 单例模式,随便你哪种写法*/
public class SingletonPattern implements Serializable, Cloneable{

    private int age = 10;
    private String name = "java";

    private static class LazyHolder {
        private static final SingletonPattern INSTANCE = new SingletonPattern();
    }
    private SingletonPattern (){}

    public static final SingletonPattern getInstance() {
        return LazyHolder.INSTANCE;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    protected SingletonPattern clone() throws CloneNotSupportedException {
        SingletonPattern singletonPattern = (SingletonPattern)super.clone();
        singletonPattern.age = this.age;
        singletonPattern.name = new String(this.name);
        return singletonPattern;
    }

}
/** 破坏单例模式 */
public class BreakSingle {

    /** 可以从heap dump中看出来有四个实例了 */
    public static void main(String[] args) throws Exception{
        SingletonPattern a = SingletonPattern.getInstance();
        SingletonPattern a1 = SingletonPattern.getInstance();

        System.out.println("a == a1 : " + (a == a1));

        SingletonPattern b = getFromFile(a);
        SingletonPattern c = reflect();
        /* 克隆方式:已重写克隆方法,注意深度克隆和浅克隆 */
        SingletonPattern d = a.clone();

        System.out.println("a = " + a);
        System.out.println("b = " + b);
        System.out.println("c = " + c);
        System.out.println("d = " + d);

        System.out.println("a == b : " + (a == b));
        System.out.println("a == c : " + (a == c));
        System.out.println("a == d : " + (a == d));
        System.out.println("b == c : " + (b == c));
        System.out.println("c == d : " + (c == d));
//        Thread.sleep(1000000000);//此处休眠一下,可以使用jvisualvm查看实例个数
    }

    /** 序列化到文件 */
    public static SingletonPattern getFromFile(SingletonPattern singletonPattern) throws Exception{
        File file = new File("java.obj");
        FileOutputStream fos = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(singletonPattern);//写到文件中
        oos.close();

        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
        //从文件中读出来
        SingletonPattern singletonPatternFromFile = (SingletonPattern) ois.readObject();
        ois.close();
        return singletonPatternFromFile;
    }

    /** 反射方法 */
    public static SingletonPattern reflect() throws Exception{
        Constructor con = SingletonPattern.class.getDeclaredConstructor();
        con.setAccessible(true);
        return (SingletonPattern) con.newInstance();
    }

}

运行结果

这里写图片描述

结果验证

使用jvisualvm或者MAT等工具分析heap dump
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值