原型模式(prototye mode)
//20210117
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现原型模式
原型模式
-
核心思想:将原有对象完整拷贝出来,然后放进另一个新创的对象里,以达到复制的目的(因为java中如果直接赋值,只是引用,内存中数据改变之后引用的所有对象都会改变,而拷贝不存在这个问题)
-
浅拷贝和深拷贝:浅拷贝就是说,将原有对象中的东西复制一份到新对象中,但是有一个问题,如果拷贝的内容中有表层只是引用的对象元素,则浅拷贝拷贝过来之后,旧对象和新对象指向的是相同的对象,只是改变了饮用,所以就产生了深拷贝的概念,其思想就是:将原有对象中所有的元素都完完整整的拿过去,有上述情况的对象,也将其深拷贝到新的对象,这样拷贝结果就和源对象没有任何关系了,仅仅是内容一致(说的有些散乱看不懂请看如下图示)
-
浅拷贝
![]()
-
深拷贝
![]()
-
模式实现源代码:
//实体类——内包含浅克隆深克隆方法
import java.util.ArrayList;
import java.util.List;
/**
* 此处直接使用java内部接口cloneable实现
*/
public class Person implements Cloneable{
private String name;//姓名
private int age;//年龄
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 List<String> getFriends() {
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", friends=" + friends +
'}';
}
//浅层克隆
public Person shallowClone(){
try{
return (Person)super.clone();
}catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//深藏克隆
public Person deepClone(){
try{
Person person = (Person)super.clone();
List<String> newFriends = new ArrayList<String>();
for (String friend : this.getFriends()){
newFriends.add(friend);
}
person.setFriends(newFriends);
return person;
}catch(CloneNotSupportedException e){
e.printStackTrace();
}
return null;
}
}
//测试主方法
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("张三");
person1.setAge(20);
List<String> friends = new ArrayList<String>();
friends.add("李四");
friends.add("王五");
person1.setFriends(friends);
System.out.println("原型:"+person1);
//person2是浅层克隆
Person person2 = person1.shallowClone();
//person3是深层克隆
Person person3 = person1.deepClone();
//获取浅层克隆的friends的list对象
List<String> person2_friends = person2.getFriends();
//向引用对象中添加值
person2_friends.add("shallow");
person2.setFriends(person2_friends);
//获取深层克隆的friends的list对象
List<String> person3_friends = person3.getFriends();
//向引用对象中添加值
person3_friends.add("deep");
person3.setFriends(person3_friends);
System.out.println("浅层克隆:"+person2);
System.out.println("原型:(check prototye 是否因为浅层克隆的元素变更而发生改变)"+person1);
System.out.println("深层克隆:"+person3);
System.out.println("原型:(check prototye 是否因为深层克隆的元素变更而发生改变)"+person1);
}
}
- 输出如下:
![]()
以上
希望对大家有所帮助



浙公网安备 33010602011771号