声明:以下都是博主浅薄的经验之谈,欢迎大家学习交流
- 博主是参考这个视频进行学习总结的:
- 设计模式学习视频(点击我)
- 提取码 : 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