破坏单例模式
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相关文章推荐
- 软件工程-构建之法 团队
- AJAX各种实现方式比较
- 六大设计原则(4)迪米特法则
- 剑指Offer--024-二叉搜索树的后序遍历序列
- Android自定义控件:仿美团下拉菜单及相关代码优化
- 1020
- 测试作业
- 实验6 在应用程序中播放音频和视频
- 137. Single Number II
- CSS样式三--盒子模型
- 快速排序的实现
- PHP中的验证码类(完善验证码)
- Handler与ProgressBar 例子
- Codeforces Educational Round 12 655ABCDE
- 堆
- 数据结构之物流信息的归并排序(非递归实现)
- [疯狂Java]I/O:字节流、字符流
- UML类图
- windows 10 64bit专业版安装Djano 1.9开发环境
- 【SQLite】Unity和SQLite数据库的应用