標籤:
使用情境
-- 通過new產生一個對象需要非常繁瑣的資料準備或存取權限,則可以使用原型模式
-- 就是java中的複製技術,以某個對象為原型複製出新的對象 ,顯然,新的對象具備原型對象的特點
優勢:
效率高(直接複製,避免了重新執行構造的過程步驟)。
複製類似於new,但是不同於new。new建立新的對象屬性採用的是預設值。複製出的對象的屬性值完全和原型對象相同,並且複製出的新對象改變不會影響原型對象。然後,再修改複製對象的值
原型模式實現:
-- Cloneable介面和clone方法
-- ProtoType模式中實現起來最困難的地方就是記憶體複製操作,所幸在java中提供了clone方法替我們做的絕大部分事情
淺複製代碼:
package com.lp.prototype;import java.util.Date;public class Sheep implements Cloneable { private String name; private Date birthday; @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone();//直接調用Object的clone方法 return obj; } public Sheep(String name, Date birthday) { super(); this.name = name; this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } Sheep(){ } }sheep類
package com.lp.prototype;import java.util.Date;public class Client { public static void main(String[] args) throws Exception{ Date date = new Date(1861381234L); Sheep s1 = new Sheep("多利",date); Sheep s2 = (Sheep)s1.clone(); date.setTime(23456789L); s1.setBirthday(date); s1.setName("少利"); System.out.println(s1.getName()); System.out.println(s1.getBirthday()); System.out.println(s1); System.out.println(s2.getName()); System.out.println(s2.getBirthday()); System.out.println(s2); //這裡s1 和s2 的對象不同 但是值是一樣的 //淺複製只複製一個對象的實值型別資料和引用的地址 // 所以他們兩個的date對象指的是同一個對象 故而只要修改其中的一個的值 另外一個還會發生變化 }}Client
結果:
這裡修改了日期對象 ,他們兩個的值都變化了 可見複製的不是對象的全部參考型別只是複製了引用而不是對象。
深複製代碼:
package com.lp.prototype;import java.util.Date;public class Sheep implements Cloneable { private String name; private Date birthday; @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone();//直接調用Object的clone方法 //添加如下代碼實現深複製 Sheep s = (Sheep)obj; s.birthday= (Date)this.birthday.clone(); return obj; } public Sheep(String name, Date birthday) { super(); this.name = name; this.birthday = birthday; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } Sheep(){ } }sheep
package com.lp.prototype;import java.util.Date;public class Client { public static void main(String[] args) throws Exception{ Date date = new Date(1861381234L); Sheep s1 = new Sheep("多利",date); Sheep s2 = (Sheep)s1.clone(); date.setTime(23456789L); s1.setBirthday(date); s1.setName("少利"); System.out.println(s1.getName()); System.out.println(s1.getBirthday()); System.out.println(s1); System.out.println(s2.getName()); System.out.println(s2.getBirthday()); System.out.println(s2); //這裡s1 和s2 的對象不同 但是值是一樣的 //淺複製只複製一個對象的實值型別資料和引用的地址 // 所以他們兩個的date對象指的是同一個對象 故而只要修改其中的一個的值 另外一個還會發生變化 }}client
結果:
這樣就可以實現深複製了
設計模式學習(四) 原型模型