一、什么是原型模式
Prototype模式是一种对象创建型模式,它采 取复制原型对象的方法来创建对象的实例。使用 Prototype模式创建的实例,具有与原型一样的 数据。
二、原型模式的特点
1. 由原型对象自身创建目标对象。也就是说,对 象创建这一动作发自原型对象本身。
2.目标对象是原型对象的一个克隆。也就是说, 通过Prototype模式创建的对象,不仅仅与原型 对象具有相同的结构,还与原型对象具有相同的 值。
3.根据对象克隆深度层次的不同,有浅度克隆与 深度克隆。
三、原型模式应用场景
- 在创建对象的时候,我们不只是希望被创建的对象继承 其基类的基本结构,还希望继承原型对象的数据。
- 希望对目标对象的修改不影响既有的原型对象(深度克 隆的时候可以完全互不影响)。
- 隐藏克隆操作的细节。很多时候,对对象本身的克隆需 要涉及到类本身的数据细节。
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class Person implements Cloneable{ 5 // 姓名 6 private String name; 7 // 年龄 8 private int age; 9 // 性别 10 private String sex; 11 //朋友 12 private List<String> friends; 13 14 public List<String> getFriends() { 15 return friends; 16 } 17 18 public void setFriends(List<String> friends) { 19 this.friends = friends; 20 } 21 22 public String getName() { 23 return name; 24 } 25 26 public void setName(String name) { 27 this.name = name; 28 } 29 30 public int getAge() { 31 return age; 32 } 33 34 public void setAge(int age) { 35 this.age = age; 36 } 37 38 public String getSex() { 39 return sex; 40 } 41 42 public void setSex(String sex) { 43 this.sex = sex; 44 } 45 46 public Person clone() { 47 try { 48 Person person = (Person)super.clone(); 49 List<String> newfriends = new ArrayList<String>(); 50 for(String friend : this.getFriends()) { 51 newfriends.add(friend); 52 } 53 person.setFriends(newfriends); 54 return person; 55 } catch (CloneNotSupportedException e) { 56 e.printStackTrace(); 57 return null; 58 } 59 } 60 }
1 import java.util.ArrayList; 2 import java.util.List; 3 4 public class MainClass { 5 public static void main(String[] args) { 6 // Person person1 = new Person(); 7 // person1.setName("lifengxing"); 8 // person1.setAge(30); 9 // person1.setSex("男"); 10 // 11 //// Person person2 = person1; 12 // Person person2 = person1.clone(); 13 // 14 // System.out.println(person1.getName()); 15 // System.out.println(person1.getAge()); 16 // System.out.println(person1.getSex()); 17 // 18 // System.out.println(person2.getName()); 19 // System.out.println(person2.getAge()); 20 // System.out.println(person2.getSex()); 21 22 Person person1 = new Person(); 23 List<String> friends = new ArrayList<String>(); 24 friends.add("James"); 25 friends.add("Yao"); 26 27 person1.setFriends(friends); 28 29 Person person2 = person1.clone(); 30 31 System.out.println(person1.getFriends()); 32 System.out.println(person2.getFriends()); 33 34 friends.add("Mike"); 35 person1.setFriends(friends); 36 System.out.println(person1.getFriends()); 37 System.out.println(person2.getFriends()); 38 } 39 }