005.设计模式之原型模式
来源:互联网 发布:时差7小时 知乎 编辑:程序博客网 时间:2024/05/21 06:31
原型模式:
概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象。不需要知道细节。
优点:
1.使用原型创建对象比new一个对象,在性能上要好很多(Object中的clone方法是本地方法,直接操作内存中的二进制流)。
2.简化对象的创建。
使用场景:
1.需要在循环中或者创建过程复杂的对象的时候
注意事项:
1.使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成
的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访
问权限都对原型模式无效。还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private
型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使
用时要特别注意。
2.深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对
象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另
行拷贝。
package com.shenghuoquaner.design.prototype;public class Work implements Cloneable { private String date; private String location; public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }}
package com.shenghuoquaner.design.prototype;public class Prototype implements Cloneable { private int type1; private String type2; private Work work; public Prototype() { work = new Work(); } public void setShallowPrototypeValue(int type11, String type22) { this.type1 = type11; this.type2 = type22; } public void setWorkClone(Work work) { } public void setShallowPrototypeObject(String date, String location) { work.setDate(date); work.setLocation(location); } public void show1() { System.out.println("int的值为:" + type1); System.out.println("String的值为:" + type2); } public void show2() { System.out.println("工作时间:" + work.getDate()); System.out.println("工作地点:" + work.getLocation()); } @Override protected Prototype clone() { Prototype shallowPrototype = null; try { shallowPrototype = (Prototype) super.clone(); work = (Work) shallowPrototype.work.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return shallowPrototype; }}
package com.shenghuoquaner.design.prototype;public class Test { public static void main(String[] args) { Prototype sp1 = new Prototype(); sp1.setShallowPrototypeValue(11, "11"); sp1.setShallowPrototypeObject("11", "11"); Prototype sp2 = (Prototype) sp1.clone(); sp2.setShallowPrototypeValue(22, "22"); sp2.setShallowPrototypeObject("22", "22"); Prototype sp3 = (Prototype) sp1.clone(); sp3.setShallowPrototypeValue(33, "33"); sp3.setShallowPrototypeObject("33", "33"); sp1.show1(); sp1.show2(); sp2.show1(); sp2.show2(); sp3.show1(); sp3.show2(); }}
0 0
- 005.设计模式之原型模式
- 设计模式之原型
- 设计模式之原型
- 设计模式 之 原型
- 设计模式之原型
- 设计模式之原型
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之-原型模式
- 设计模式之 原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- 设计模式之--原型模式
- 设计模式之原型模式
- 设计模式之原型模式
- base64转换成pdf在页面显示
- [BZOJ1834]网络扩容 做题笔记
- 项目管理:CocoaPods建立私有仓库
- JSONObject与JSONArray的使用
- 欢迎使用CSDN-markdown编辑器
- 005.设计模式之原型模式
- 怎样关闭mysql slave
- Java单例模式深入详解
- LINQ中Aggregate的使用实例
- Codeforces Round #344 (Div. 2)-A. Interview(前缀和)
- 应用程序和驱动中使用I2C的流程
- SCP命令拷贝到另一台服务器不需要输入密码
- IntelliTest初探
- java(spring)手把手教你写个AOP框架