设计模式——原型模式

来源:互联网 发布:百分百qq综合采集软件 编辑:程序博客网 时间:2024/06/15 06:52

概述:通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。就是java中的克隆技术,以某个对象为原型,复制出新的对象。显然,新的对象具备原型对象的特点。如果需要短时间创建大量对象,并且new的过程比较耗时。则可以考虑使用原型模式!


优势:效率高(直接克隆,避免了重新执行构造过程步骤)


两种方式

  • 使用实现Cloneable接口的方式实现浅克隆
  • 使用序列化和反序列化的方式实现深克隆


例子:实现一个类的克隆

克隆羊类:

import java.io.Serializable;import java.util.Date;// 克隆羊public class Sheep implements Cloneable,Serializable {private String name;private Date birthday;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;}@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();  //直接调用object对象的clone()方法!return obj;}}
浅克隆测试类:

import java.util.Date;// 测试原型模式(浅克隆)public class Client {public static void main(String[] args) throws Exception {Date date = new Date(1L);Sheep s1 = new Sheep("多利",date);System.out.println(s1);System.out.println(s1.getName());System.out.println(s1.getBirthday());// 克隆Sheep s2 = (Sheep) s1.clone();// 改变s1中date的值date.setTime(1111111L);System.out.println(s1.getBirthday());System.out.println(s2);// 与s1的值不一致System.out.println(s2.getName());System.out.println(s2.getBirthday());// 该值是改变后的值:1111111L}}

深克隆测试类:

import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.Date;// 原型模式(深复制,使用序列化和反序列化的方式实现深复制)public class Client2 {public static void main(String[] args) throws Exception {Date date = new Date(1L);Sheep s1 = new Sheep("多利",date);System.out.println(s1);System.out.println(s1.getName());System.out.println(s1.getBirthday());// 使用序列化和反序列化实现深复制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);// 通过readObject实现克隆对象Sheep s2 = (Sheep) ois.readObject();// 改变s1中date的值date.setTime(1111111L);System.out.println(s1.getBirthday());// 该值是改变后的值:1111111LSystem.out.println(s2);System.out.println(s2.getName());System.out.println(s2.getBirthday());// 该值还是改变前后的值:1L}}



原创粉丝点击