原型模式定義:用原型實例指定建立對象的種類,並經過拷貝這些原型建立新的對象。java
關於克隆,其實不管是 JAVA代碼仍是C#代碼都封裝了一個接口Cloneable,實現這個接口就能夠進行克隆了。
git
package com.amosli.dp.build.prototype; public class Prototype implements Cloneable { public Prototype clone() { try { return (Prototype) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } } package com.amosli.dp.build.prototype; public class ConcretePrototype extends Prototype{ public void show(){ System.out.println("show ..."); } } package com.amosli.dp.build.prototype; import java.util.ArrayList; import java.util.List; public class Client { public static void main(String[] args) { ConcretePrototype concretePrototype = new ConcretePrototype(); for (int i = 0; i < 5; i++) { ConcretePrototype clone = (ConcretePrototype) concretePrototype.clone(); clone.show(); } Person p = new Person(); p.setAddr("sh"); p.setName("amosli"); List<String> friends=new ArrayList<String>(); friends.add("a"); friends.add("b"); friends.add("c"); p.setFriends(friends); p.setClasses(new String[2]); Person clone = p.clone(); System.out.println(p); System.out.println(clone); System.out.println(p.getClasses()); System.out.println(clone.getClasses()); System.out.println(clone.getFriends()); System.out.println(p.getFriends()); } } package com.amosli.dp.build.prototype; import java.util.List; public class Person implements Cloneable { public Person clone() { try { Person p = (Person) super.clone(); p.setClasses(classes.clone()); return p; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; } private String[] classes; public String[] getClasses() { return classes; } public void setClasses(String[] classes) { this.classes = classes; } private String name; private String addr; private List<String> friends; public List<String> getFriends() { return friends; } // @Override // public String toString() { // return "Person [name=" + name + ", addr=" + addr + ", friends=" + friends // + "]"; // } public void setFriends(List<String> friends) { this.friends = friends; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } }
能夠看到 克隆對象和原對象地址是不同的,可是其中的classes地址是同樣的,說明只是地址引用,因此若是想避免同同樣地址引用,因此最好須要對單獨的屬性進行克隆。github
這是代碼之間的區別爲:ide
原型模式是一種比較簡單的模式,也很是容易理解,實現一個接口,重寫一個方法即完成了原型模式。在實際應用中,原型模式不多單獨出現。常常與其餘模式混用,他的原型類Prototype也經常使用抽象類來替代。ui
本系列文章源碼地址,https://github.com/amosli/dp 歡迎Fork & Star !!this