原型模式

1. 什么是原型模式

Prototype 模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用 Prototype 模式创建的实例,具有与原型一样的数据。

2. 原型模式的特点

  1. 由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。
  2. 目标对象是原型对象的一个克隆。也就是说,通过 Prototype 模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。
  3. 根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

3. 原型模式应用场景

  • 在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。
  • 希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)
  • 隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

4. 代码演示

4.1. 直接创建

  1. public class Person1 {
  2. private String name;
  3. private int age;
  4. private String sex;
  5. public String getName() {
  6. return name;
  7. }
  8. public void setName(String name) {
  9. this.name = name;
  10. }
  11. public int getAge() {
  12. return age;
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. public String getSex() {
  18. return sex;
  19. }
  20. public void setSex(String sex) {
  21. this.sex = sex;
  22. }
  23. @Override
  24. public String toString() {
  25. return "Person1{" +
  26. "name='" + name + '\'' +
  27. ", age=" + age +
  28. ", sex='" + sex + '\'' +
  29. '}';
  30. }
  31. }
  1. Person person1 = new Person1();
  2. person1.setName("lifengxing");
  3. person1.setAge(30);
  4. person1.setSex("男");
  5. Person person2 = new Person1();
  6. person2.setName("beifeng");
  7. person2.setAge(30);
  8. person2.setSex("男");
  9. System.out.println(person1);
  10. System.out.println(person2);
  1. Person1{name='lifengxing', age=30, sex='男'}
  2. Person1{name='beifeng', age=30, sex='男'}

4.2. 使用克隆

  1. public class Person2 implements Cloneable {
  2. // ...
  3. @Override
  4. protected Person2 clone() {
  5. try {
  6. return (Person2) super.clone();
  7. } catch (CloneNotSupportedException e) {
  8. e.printStackTrace();
  9. }
  10. return null;
  11. }
  12. }
  1. Person2 person1 = new Person2();
  2. person1.setName("lifengxing");
  3. person1.setAge(30);
  4. person1.setSex("男");
  5. Person2 person2 = person1.clone();
  6. person2.setName("厉风行");
  7. System.out.println(person1);
  8. System.out.println(person2);
  1. Person2{name='lifengxing', age=30, sex='男'}
  2. Person2{name='厉风行', age=30, sex='男'}

4.3. 浅度克隆

  1. public class Person3 implements Cloneable {
  2. // ...
  3. private List<String> friends;
  4. // ...
  5. @Override
  6. protected Person3 clone() {
  7. try {
  8. return (Person3) super.clone();
  9. } catch (CloneNotSupportedException e) {
  10. e.printStackTrace();
  11. }
  12. return null;
  13. }
  14. }
  1. Person3 person1 = new Person3();
  2. person1.setName("lifengxing");
  3. List<String> friends = new ArrayList<>();
  4. friends.add("James");
  5. friends.add("Yao");
  6. person1.setFriends(friends);
  7. Person3 person2 = person1.clone();
  8. person2.setName("厉风行");
  9. System.out.println(person1);
  10. System.out.println(person2);
  11. System.out.println(person1.getFriends());
  12. System.out.println(person2.getFriends());
  13. friends.add("Mike");
  14. person1.setFriends(friends);
  15. System.out.println(person1.getFriends());
  16. System.out.println(person2.getFriends());
  1. Person3{name='lifengxing', age=0, sex='null', friends=[James, Yao]}
  2. Person3{name='厉风行', age=0, sex='null', friends=[James, Yao]}
  3. [James, Yao]
  4. [James, Yao]
  5. [James, Yao, Mike]
  6. [James, Yao, Mike]

4.4. 深度克隆

  1. public class Person4 implements Cloneable {
  2. // ...
  3. @Override
  4. protected Person4 clone() {
  5. try {
  6. Person4 person = (Person4) super.clone();
  7. List<String> friends = new ArrayList<>(this.getFriends());
  8. person.setFriends(friends);
  9. return person;
  10. } catch (CloneNotSupportedException e) {
  11. e.printStackTrace();
  12. }
  13. return null;
  14. }
  15. }
  1. Person4 person1 = new Person4();
  2. person1.setName("lifengxing");
  3. List<String> friends = new ArrayList<>();
  4. friends.add("James");
  5. friends.add("Yao");
  6. person1.setFriends(friends);
  7. Person4 person2 = person1.clone();
  8. person2.setName("厉风行");
  9. System.out.println(person1);
  10. System.out.println(person2);
  11. System.out.println(person1.getFriends());
  12. System.out.println(person2.getFriends());
  13. friends.add("Mike");
  14. person1.setFriends(friends);
  15. System.out.println(person1.getFriends());
  16. System.out.println(person2.getFriends());
  1. Person3{name='lifengxing', age=0, sex='null', friends=[James, Yao]}
  2. Person3{name='厉风行', age=0, sex='null', friends=[James, Yao]}
  3. [James, Yao]
  4. [James, Yao]
  5. [James, Yao, Mike]
  6. [James, Yao]