所謂原型模式就是用原型例項指定建立物件的種類,並且通過複製這些原型建立新的物件。在原型模式中,所發動建立的物件通過請求原型物件來拷貝原型物件自己來實現建立過程,當然所發動建立的物件需要知道原型物件的型別。在拷貝中又分為深拷貝和淺拷貝。
深拷貝:相當於重新new乙個新的物件,記憶體位址和之前物件的不一樣。在深拷貝中對於物件的引用預設是淺拷貝,要實現完全的深拷貝,需要對物件的引用也實現深拷貝。
因此可以看出原型設計模式和深拷貝和淺拷貝有莫大的關聯。
通過以下案例說明原型設計模式:
class person
public void setname(string name)
public int getage()
public void setage(int age)
public string getheight()
public void setheight(string height)
public car getcar()
@override
public string tostring() ';
}public void setcar(car car)
}
class car
public string getname()
public void setname(string name)
public string getcolor()
public void setcolor(string color)
@override
public string tostring() ';}}
上面建立了兩個類person和car,這兩個類是單獨的類,現在建立兩個person,乙個桶new關鍵字在堆記憶體中建立,另乙個通過淺拷貝進行賦值,如下:
public static void main(string args)
如上person2為淺拷貝,執行列印如下:
發現person1和person2的值一樣,說明person2還是指向person1的記憶體位址,並不是乙個新的物件。
以上演示了淺拷貝,如果讓person實現cloneable介面,重寫clone方法,那麼就可以實現深拷貝,即person2是從person1轉殖過來,兩個不同的記憶體位址,初始值也和person1一樣,這時候改變person2的age屬性,不會影響person1的值了。如下:
class person implements cloneable catch (clonenotsupportedexception e)
return person;
}......
}
再次執行列印如下:
可以看出person1和person2的age屬性不一樣。
以上的深拷貝屬於不完全的深拷貝,在基本資料型別變數中能夠實現深拷貝,但是在引用資料型別中還是沒有轉殖,只是乙個引用。在上面的person類中引用car,我們嘗試更換car屬性進行比較:
public static void main(string args)
列印結果如下:
可以看出person1和person2的car屬性的color還是一樣的。
這種情況就屬於不完全的深拷貝,要實現完全的深拷貝,需要對物件的引用也實現深拷貝,因此對car也實現深拷貝,如下:
class car implements cloneable
}
僅僅這樣還不夠,需要在person類中操作。
class person implements cloneable catch (clonenotsupportedexception e)
return person;}}
再次檢視控制台列印:
可以看出car的color已經發生變化了。
以上就是原型設計模式的案例。
1、優點
2、缺點
設計模式之原型模式
原型模式其實就是從乙個物件再建立乙個可定製的物件,而且不需要知道建立的細節。具體就是說通過複製或者轉殖乙個原型物件產生新的物件 轉殖物件 分為兩種 深複製或者淺複製,這兩種的主要區別是 在原型中如果有物件的引用,淺複製是將引用複製過來了,也就是淺複製和原型中的物件的引用相同,而深複製是將轉殖物件中引...
設計模式之原型模式
include include 此練習為原型模式方法的練習 原型模式揭示了在同一原型上可以通過複製使得 只需要例項化一次,再通過相應的類函式操作可以得到 同一原型下的不同的版本物件 此練習將考慮在實際開發中 比如 工作經歷也是作為乙個類被含在簡歷類中的情況 這情況將涉及到類的引用和深 淺複製 原型基...
設計模式之原型模式
原型模式的思想就是將乙個物件作為原型,對其進行複製 轉殖,產生乙個和原物件類似的新物件 複製過程可分為淺複製和深複製。淺複製是指直接呼叫父類 即object類 的clone方法 super.clone 該方法是本地 native 方法,呼叫該方法clone出來的新物件,基本資料型別的屬性變數是新建立...