1 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节
2 实现方式: 通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
3 使用情况:很多时候,创建对象的时候,只是在某些属性值上有区别,而大部分都很相似,该类的用户对于该类的对象是怎么创建的,对类的内部结构这些都不关心的情况,但是这样的对象的初始化相对来说比较复杂, 而且需要耗费较长的时间或资源,这种情况下,我们可以考虑使用Prototype模式。
4 原型模式 prototype-(浅度克隆):浅克隆是指克隆一个对象,而该对象的属性只是基本数据类型,只克隆出该对象!
eg:
1 package com.lovo.prototype.two; 2 public class Player implements Cloneable { 3 4 private int id; 5 private String name; 6 private String skill; 7 8 public int getId() { 9 return id;10 }11 public void setId(int id) {12 this.id = id;13 }14 public String getName() {15 return name;16 }17 public void setName(String name) {18 this.name = name;19 }20 public String getSkill() {21 return skill;22 }23 public void setSkill(String skill) {24 this.skill = skill;25 }26 27 28 @Override29 public String toString() {30 return "Player [id=" + id + ", name=" + name + ", skill=" + skill + "]";31 }32 33 /**34 * 浅克隆35 * @return36 * @throws CloneNotSupportedException37 */38 public Player qianClone() throws CloneNotSupportedException{39 return (Player) super.clone();40 }41 42 43 44 45 46 }
1 package com.lovo.prototype.two; 2 3 public class Test { 4 5 public static void main(String[] args) throws CloneNotSupportedException { 6 Player p=new Player(); 7 p.setId(1); 8 p.setName("小明"); 9 p.setSkill("灌篮");10 11 Player p2=p.qianClone();12 13 System.out.println(p);14 System.out.println("=============");15 System.out.println(p2);16 System.out.println(p==p2);//fasle17 18 }19 20 }
5 原型模式 prototype-(深度克隆):深度克隆是指克隆的目标里面还有引用类型,引用类型里还有引用类型,同时把引用类型克隆出来叫深度克隆!
1 package com.lovo.prototype.two; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.IOException; 6 import java.io.ObjectInputStream; 7 import java.io.ObjectOutputStream; 8 import java.io.Serializable; 9 import java.util.List;10 11 12 13 public class Player implements Cloneable,Serializable {14 private static final long serialVersionUID = 1L;15 private int id;16 private String name;17 private String skill;18 private Listlist;19 20 public List getList() {21 return list;22 }23 public void setList(List list) {24 this.list = list;25 }26 public int getId() {27 return id;28 }29 public void setId(int id) {30 this.id = id;31 }32 public String getName() {33 return name;34 }35 public void setName(String name) {36 this.name = name;37 }38 public String getSkill() {39 return skill;40 }41 public void setSkill(String skill) {42 this.skill = skill;43 }44 45 @Override46 public String toString() {47 return "Player [id=" + id + ", name=" + name + ", skill=" + skill48 + ", list=" + list + "]";49 }50 51 52 /**53 * 深克隆54 * @return55 * @throws IOException56 * @throws ClassNotFoundException57 */58 public Player deepClone() throws IOException, ClassNotFoundException{59 ByteArrayOutputStream bos=new ByteArrayOutputStream();60 ObjectOutputStream oos=new ObjectOutputStream(bos);61 oos.writeObject(this);62 63 ByteArrayInputStream bis=new ByteArrayInputStream(bos.toByteArray());64 ObjectInputStream ois=new ObjectInputStream(bis);65 Player p=(Player) ois.readObject();66 67 68 69 70 return p;71 72 }73 74 75 }
1 package com.lovo.prototype.two; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.List; 6 7 public class Test { 8 9 public static void main(String[] args) throws CloneNotSupportedException, ClassNotFoundException, IOException {10 Player p=new Player();11 p.setId(1);12 p.setName("小明明");13 p.setSkill("灌篮");14 15 Player p2=p.deepClone();16 Listlist=new ArrayList<>();17 list.add("跑步");18 list.add("射击");19 p2.setList(list);20 21 22 System.out.println(p);23 System.out.println("=============");24 System.out.println(p2);25 26 }27 28 }