意圖
原型模式是創建型設計模式,可以復制已存在的物件而無需依賴它的類,
問題
假如現在有一個物件,我們想完全復制一份新的,我們該如何做?
- 創建同一個類的新物件
- 遍歷所有已存在物件的值,然后將他們的值復制到新物件,
很好,但是我們會發現存在如下問題:
- 該物件的值并不一定全對對外開放,比如Java中的private,外部無法訪問,
- 使用這種辦法必須知道該物件所屬的類而且依賴這個類,
- 有些時候我們只知道該物件實作的介面,而不是具體的實作類,
解決
這個時候我們就需要原型模式,原型模式將克隆程序委托給被克隆的物件,該模式為所有支持克隆的物件宣告一個公共介面,這個介面允許克隆一個物件,而不必將代碼和該物件的類耦合,通常,這樣的介面只包含一個克隆方法,
克隆方法的實作在所有類中都非常相似,該方法創建當前類的一個物件,并將舊物件的所有欄位值轉移到新物件中,這樣就可以復制私有欄位,因為大多數編程語言都允許物件訪問屬于同一類的私有欄位,
結構

原型模式包含如下角色
- Prototype:它是宣告克隆方法的介面,是所有具體原型類的公共父類,可以是抽象類也可以是介面,甚至還可以是具體實作類,
- ConcretePrototype:它實作在抽象原型類中宣告的克隆方法,在克隆方法中回傳自己的一個克隆物件
實體
在Java中,所有的類都繼承了java.lang.Object,Object提供了clone方法能實作Java物件復制,
我們只需注意兩點即可,
- 實作克隆的Java類必須實作一個標識介面Cloneable,表示這個Java類支持被復制,如果沒有實作這個介面但呼叫了clone()方法,Java編譯器將拋出一個CloneNotSupportedException例外,
- 淺克隆和深克隆
java的clone函式只是“淺克隆”,也就是僅對變數值做復制,如果是參考變數,其內容指向的記憶體地址是不變的,
參考文獻
https://refactoring.guru/design-patterns/prototype
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/29327.html
標籤:設計模式
上一篇:創建型模式
下一篇:大話設計模式隨記
