(4)设计模式之原型模式(创建型模式)

xiaoxiao2021-02-28  123

声明:以下都是博主浅薄的经验之谈,欢迎大家学习交流

博主是参考这个视频进行学习总结的: 设计模式学习视频(点击我)提取码 : 29oc 原型模式分为两种 浅度克隆 深度克隆

引入克隆模式的介绍

public class MainClass { public static void main(String[] args) { /***引入克隆模式的介绍****/ /**当创建两个类似person对象的时候,属性中只有名字发生了改变其他的属性没有改变的情况下,以下代码就可以进行优化**/ Person p1 = new Person(); p1.setAge(12); p1.setName("张某将"); p1.setSex("男"); Person p2 = new Person(); p2.setAge(12); p2.setName("张金福"); p2.setSex("男"); } }

浅度克隆

Person.java public class Person implements Cloneable { private String name; private int age; private String sex; private List<String> friends; 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 getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public List<String> getFriends() { return friends; } public void setFriends(List<String> friends) { this.friends = friends; } public Person clone() { try { return (Person)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", friends=" + friends + "]"; } MainClass.java public class MainClass { public static void main(String[] args) { /**1.克隆模式(浅度克隆)***/ /**如果对象的属性属于引用变量类型,那么只进行地址的克隆(除去String类型) **/ /**也就是说对p4 的List<String> friends;的变量值进行改变,那么 p3的List<String> friends 也会改变**/ List<String> friends = new ArrayList<>(); friends.add("八戒程序猿"); friends.add("Kobe"); Person p3 = new Person(); p3.setAge(12); p3.setName("张xx"); p3.setSex("男"); p3.setFriends(friends); Person p4 = p3.clone(); p3.setAge(14);//修改p3年龄 p3.getFriends().add("Jmes"); p4.setName("张金福"); }

深度克隆

public class Person implements Cloneable { private String name; private int age; private String sex; private List<String> friends; 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 getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public List<String> getFriends() { return friends; } public void setFriends(List<String> friends) { this.friends = friends; } public Person clone() { try { Person clone = (Person) super.clone(); List<String> newFriends = new ArrayList<>(); for (String friend : this.friends) { newFriends.add(friend); } clone.setFriends(newFriends); return clone; } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", friends=" + friends + "]"; } MainClass.java public class MainClass { public static void main(String[] args) { /**深度度克隆)***/ /**此方式属于深度的克隆,对于该对象类变量属于引用变量类型的也进行复制(也就是说重新开辟一块内存堆)**/ List<String> friends = new ArrayList<>(); friends.add("八戒程序猿"); friends.add("Kobe"); Person p3 = new Person(); p3.setAge(12); p3.setName("张xx"); p3.setSex("男"); p3.setFriends(friends); Person p4 = p3.clone(); p3.setAge(14);//修改p3年龄 p3.getFriends().add("Jmes"); p4.setName("张金福"); System.out.println("p3 对象" + p3); System.out.println("p4 对象" + p4); } } 博主是参考这个视频进行学习总结的: 设计模式学习视频(点击我)提取码 : ivtk
转载请注明原文地址: https://www.6miu.com/read-21497.html

最新回复(0)