赞
踩
目录
羊类
- public class Sheep {
- private String name;
- private int age;
- private String color;
- public Sheep(String name, int age, String color) {
- super();
- this.name = name;
- this.age = age;
- this.color = color;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getColor() {
- return color;
- }
- public void setColor(String color) {
- this.color = color;
- }
- @Override
- public String toString() {
- return "Sheep [name=" + name + ", age=" + age + ", color=" + color + "]";
- }
-
-
- }
最常用的思路就是直接new
- public class Client {
-
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- //传统的方法
- Sheep sheep = new Sheep("tom", 1, "白色");
-
- Sheep sheep2 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
- Sheep sheep3 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
- Sheep sheep4 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
- Sheep sheep5 = new Sheep(sheep.getName(), sheep.getAge(), sheep.getColor());
- //....
-
- System.out.println(sheep);
- System.out.println(sheep2);
- System.out.println(sheep3);
- System.out.println(sheep4);
- System.out.println(sheep5);
- //...
- }
-
- }
优缺点:
羊继承cloneable接口,重写clone方法
- public class Sheep implements Cloneable {
- private String name;
- private int age;
- private String color;
- private String address = "蒙古羊";
- public Sheep friend; //是对象, 克隆是会如何处理
- public Sheep(String name, int age, String color) {
- super();
- this.name = name;
- this.age = age;
- this.color = color;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getColor() {
- return color;
- }
- public void setColor(String color) {
- this.color = color;
- }
-
-
-
- @Override
- public String toString() {
- return "Sheep [name=" + name + ", age=" + age + ", color=" + color + ", address=" + address + "]";
- }
- //克隆该实例,使用默认的clone方法来完成
- @Override
- protected Object clone() {
-
- Sheep sheep = null;
- try {
- sheep = (Sheep)super.clone();
- } catch (Exception e) {
- // TODO: handle exception
- System.out.println(e.getMessage());
- }
- // TODO Auto-generated method stub
- return sheep;
- }
-
-
- }
克隆
- public class Client {
-
- public static void main(String[] args) {
- System.out.println("原型模式完成对象的创建");
- // TODO Auto-generated method stub
- Sheep sheep = new Sheep("tom", 1, "白色");
-
- sheep.friend = new Sheep("jack", 2, "黑色");
-
- Sheep sheep2 = (Sheep)sheep.clone(); //克隆
- Sheep sheep3 = (Sheep)sheep.clone(); //克隆
- Sheep sheep4 = (Sheep)sheep.clone(); //克隆
- Sheep sheep5 = (Sheep)sheep.clone(); //克隆
-
- System.out.println("sheep2 =" + sheep2 + "sheep2.friend=" + sheep2.friend.hashCode());
- System.out.println("sheep3 =" + sheep3 + "sheep3.friend=" + sheep3.friend.hashCode());
- System.out.println("sheep4 =" + sheep4 + "sheep4.friend=" + sheep4.friend.hashCode());
- System.out.println("sheep5 =" + sheep5 + "sheep5.friend=" + sheep5.friend.hashCode());
- }
-
- }
这样的好处是当羊类发生修改的时候只需要修改上面代码中的sheep对象,而不像传统那样每个都需要修改
需要知道这样的原型模式是浅拷贝
准备工作
- public class DeepCloneableTarget implements Serializable, Cloneable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private String cloneName;
-
- private String cloneClass;
-
- //构造器
- public DeepCloneableTarget(String cloneName, String cloneClass) {
- this.cloneName = cloneName;
- this.cloneClass = cloneClass;
- }
-
- //因为该类的属性,都是String , 因此我们这里使用默认的clone完成即可
- @Override
- protected Object clone() throws CloneNotSupportedException {
- return super.clone();
- }
- }
-
DeepCloneableTarget 作为DeepProtoType 的一个引用属性
- public class DeepProtoType implements Serializable, Cloneable{
-
- public String name; //String 属性
- public DeepCloneableTarget deepCloneableTarget;// 引用类型
- public DeepProtoType() {
- super();
- }
-
-
- //深拷贝 - 方式 1 使用clone 方法
- @Override
- protected Object clone() throws CloneNotSupportedException {
-
- Object deep = null;
- //这里完成对基本数据类型(属性)和String的克隆
- deep = super.clone();
- //对引用类型的属性,进行单独处理
- DeepProtoType deepProtoType = (DeepProtoType)deep;
- deepProtoType.deepCloneableTarget = (DeepCloneableTarget)deepCloneableTarget.clone();
-
- // TODO Auto-generated method stub
- return deepProtoType;
- }
-
- }
调用
- public class Client {
-
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- DeepProtoType p = new DeepProtoType();
- p.name = "宋江";
- p.deepCloneableTarget = new DeepCloneableTarget("大牛", "小牛");
-
- //方式1 完成深拷贝
-
- DeepProtoType p2 = (DeepProtoType) p.clone();
-
- System.out.println("p.name=" + p.name + "p.deepCloneableTarget=" + p.deepCloneableTarget.hashCode());
- System.out.println("p2.name=" + p.name + "p2.deepCloneableTarget=" + p2.deepCloneableTarget.hashCode());
-
-
-
- }
-
- }
- public class DeepProtoType implements Serializable, Cloneable{
-
- public String name; //String 属性
- public DeepCloneableTarget deepCloneableTarget;// 引用类型
- public DeepProtoType() {
- super();
- }
-
-
-
- //深拷贝 - 方式2 通过对象的序列化实现 (推荐)
-
- 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 copyObj = (DeepProtoType)ois.readObject();
-
- return copyObj;
-
- } catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- return null;
- } finally {
- //关闭流
- try {
- bos.close();
- oos.close();
- bis.close();
- ois.close();
- } catch (Exception e2) {
- // TODO: handle exception
- System.out.println(e2.getMessage());
- }
- }
-
- }
-
- }
调用
- public class Client {
-
- public static void main(String[] args) throws Exception {
- // TODO Auto-generated method stub
- DeepProtoType p = new DeepProtoType();
- p.name = "宋江";
- p.deepCloneableTarget = new DeepCloneableTarget("大牛", "小牛");
-
-
- //方式2 完成深拷贝
- DeepProtoType p2 = (DeepProtoType) p.deepClone();
-
- System.out.println("p.name=" + p.name + "p.deepCloneableTarget=" + p.deepCloneableTarget.hashCode());
- System.out.println("p2.name=" + p.name + "p2.deepCloneableTarget=" + p2.deepCloneableTarget.hashCode());
-
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。