学习笔记——JAVA设计模式<4>原型模式
来源:互联网 发布:js禁止复制文字 编辑:程序博客网 时间:2024/05/24 06:31
原型模式prototype
通过new产生一个对象需要非常繁琐的数据准备和访问权限,则可以使用原型模式
java中的克隆模式,以某个对象为原型,复制出新的对象。显然新的对象具备原型对象的特点
优势:效率高(直接克隆,避免了重新执行构造的过程步骤)
克隆类似于new,但不同于new。new创建的新对象属性采用默认值。克隆出来的对象属性值和原型对象相同,并且克隆出来的新对象改变不会影响原型对象。然后再修改克隆对象的值
原型模式实现
Cloneable接口和clone方法
Prototype模式中实现起来最困难的地方就是内存复制操作,所幸java中提供了clone()方法替我们做了绝大数工作
克隆和拷贝是一回事
浅克隆
package studyGFO;import java.util.Date;import javax.xml.crypto.Data;/** * 测试原型模式(浅克隆) * @author http://blog.csdn.net/thewaiting * */public class Client { public static void main(String[] args) throws CloneNotSupportedException { Date date = new Date(1111111111111L); Sheep s1 = new Sheep("多利",date); s1.setBirthday(new Date(88888888888888888L)); System.out.println(s1.getBirthday()); System.out.println(s1.getName()); System.out.println(s1); Sheep s2 = (Sheep) s1.clone(); s2.setName("多利2");//改变属性 System.out.println(s2.getName()); System.out.println(s1.getBirthday()); System.out.println(s2); }}
package studyGFO;import java.util.Date;/** * * @author http://blog.csdn.net/thewaiting * *///clone并不是Cloneable的方法 但必须实现接口public class Sheep implements Cloneable{ private String name; private Date birthday; @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone();//直接调用object对象的clone()方法 return obj; } public Sheep() { } public Sheep(String name, Date birthday) { super(); this.name = name; this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; }}
深克隆
修改代码
@Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone();//直接调用object对象的clone()方法 //添加以下代码实现深复制 Sheep s= (Sheep) obj; //把属性进行克隆 s.birthday = (Date) this.birthday.clone(); return obj; }
序列化和反序列化实现深克隆
package studyGFO;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.Date;import javax.xml.crypto.Data;/** * 原型模式(使用序列化和反序列化实现深复制h) * @author http://blog.csdn.net/thewaiting * */public class Client { public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException { Date date = new Date(1111111111111L); Sheep s1 = new Sheep("多利", date); s1.setBirthday(new Date(88888888888888888L)); System.out.println(s1.getBirthday()); System.out.println(s1.getName()); System.out.println(s1.getName()); System.out.println(s1); //Sheep s2 = (Sheep) s1.clone(); //使用序列化和反序列化实现深复制 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(s1); byte[] bytes = bos.toByteArray(); ByteArrayInputStream bis =new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); Sheep s2 = (Sheep) ois.readObject(); //s2.setName("多利2");// 改变属性 System.out.println(s2.getName()); System.out.println(s1.getBirthday()); System.out.println(s2); }}public class Sheep implements Cloneable,Serializable{//添加接口}
阅读全文
0 0
- 学习笔记——JAVA设计模式<4>原型模式
- java设计模式学习笔记-原型模式
- 设计模式学习笔记——原型模式
- 设计模式学习笔记——原型模式
- 设计模式学习笔记——原型模式
- 设计模式学习笔记——Prototype原型模式
- 六、原型模式——设计模式学习笔记
- 《设计模式》学习笔记6——原型模式
- 设计模式学习笔记(十一)—Prototype原型模式
- Java设计模式学习04——原型模式
- java设计模式学习—原型模式(Prototype)
- 设计模式笔记——原型模式
- 设计模式学习05—原型模式
- java 设计模式学习笔记(8) - 原型模式
- 设计模式学习笔记---原型模式prototype(Java版)
- java/android 设计模式学习笔记(11)---原型模式
- java设计模式——原型模式
- Java设计模式——原型模式
- 【bzoj4390】[Usaco2015 dec]Max Flow
- 基于vue2框架的机器人自动回复mini-project
- C语言实现个人所得税计算
- android之数据库的增删改查
- 矩阵连乘的动态规划解法
- 学习笔记——JAVA设计模式<4>原型模式
- Valgrind概述
- Spring MVC 思想
- JDBC(2):事务,批次处理文件,处理大文件
- 【Python】第一次使用Python(python基础教程)
- c语言一维数组做参数传递给函数:
- 文本复制
- PES,TS,PS,RTP等流的打包格式解析之PS流
- react项目遇到问题