目录
1、原型模式-基本介绍
1、使用原型实例指定创建对象的种类,并通过拷贝这些原型,创建新的对象
2、原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的过程
2、基本使用
通过Object的clone()方法来实现原型模式
Java代码:
/** * @author wjh * @date 2020-06-15 13:39 */ // 实现Cloneable接口,重写clone方法 public class Sheep implements Cloneable { private String name; private Integer age; private String color; public Sheep(String name, Integer age, String color) { this.name = name; this.age = age; this.color = color; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } // 重写克隆方法,克隆本实例(默认的clone方法) @Override protected Object clone() { Sheep sheep = null; try { sheep = (Sheep) super.clone(); } catch (Exception e) { System.out.println(e.getMessage()); } return sheep; } @Override public String toString() { return "Sheep{" + "name='" + name + '\'' + ", age=" + age + ", color='" + color + '\'' + '}'; } }
客户端使用:
public class Client { public static void main(String[] args) { // 原型 Sheep sheep = new Sheep("tom", 18, "黑色"); // 调用克隆方法克隆原型 Sheep sheep1 = (Sheep) sheep.clone(); Sheep sheep2 = (Sheep) sheep.clone(); Sheep sheep3 = (Sheep) sheep.clone(); System.out.println(sheep); System.out.println(sheep1); System.out.println(sheep2); System.out.println(sheep3); } }
3、浅拷贝与深拷贝
浅拷贝
- 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递(将该属性值复制一份给新对象)
- 对于数据类型为引用数据类型的成员变量(数组、对象),浅拷贝会进行引用传递(将该成员变量的引用值复制一份给新对象,实际上两个对象的这个成员变量都是指向的同一个实例)
- 浅拷贝是使用默认的clone()方法来实现的 sheep = (Sheep)super.clone();
深拷贝
- 复制对象的所有基本数据类型的成员变量
- 为所有的引用数据类型的成员变量申请存储空间,并复制每一个引用数据类型成员变量所引起的对象,直到该对象可达的所有对象(深拷贝要对整个对象进行拷贝)
实现方式:
①重写clone方法来实现深拷贝
public class DeepProtoType implements Serializable, Cloneable { public String name; public DeepCloneableTarget deepCloneableTarget; // 引用类型 public DeepProtoType(String name, DeepCloneableTarget deepCloneableTarget) { this.name = name; this.deepCloneableTarget = deepCloneableTarget; } @Override public String toString() { return "DeepProtoType{" + "name='" + name + '\'' + ", deepCloneableTarget=" + deepCloneableTarget + '}'; } // 方式一、clone @Override protected Object clone() throws CloneNotSupportedException { Object deep = null; // 通过浅拷贝完成对基本数据类型和String的复制 deep = super.clone(); // 单独对引用数据类型进行拷贝 DeepProtoType deepProtoType = (DeepProtoType) deep; deepProtoType.deepCloneableTarget = (DeepCloneableTarget) deepCloneableTarget.clone(); return deepProtoType; } }
②通过对象序列化来实现深拷贝
public class DeepProtoType implements Serializable, Cloneable { public String name; public DeepCloneableTarget deepCloneableTarget; // 引用类型 public DeepProtoType(String name, DeepCloneableTarget deepCloneableTarget) { this.name = name; this.deepCloneableTarget = deepCloneableTarget; } // 方式二、对象序列化 public Object deepClone() { // 创建流对象 ByteArrayOutputStream bos = null; ObjectOutputStream oos = null; ByteArrayInputStream bis = null; ObjectInputStream ois = null; try { // 序列化 bos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(bos); oos.writeObject(this);// 当前这个对象以对象流的方式输出 // 反序列化 bis = new ByteArrayInputStream(bos.toByteArray()); ois = new ObjectInputStream(bis); DeepProtoType copyObject = (DeepProtoType) ois.readObject(); return copyObject; } catch (Exception e) { e.printStackTrace(); return null; } finally { try { bos.close(); oos.close(); bis.close(); ois.close(); } catch (Exception e) { e.printStackTrace(); } } } }