您的位置:首页 > 其它

破坏单例模式

2016-04-21 22:35 260 查看

破坏单例模式

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

直接上代码

/** 单例模式,随便你哪种写法*/
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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: