大白話原型模式(Prototype Pattern)

意圖

原型模式是建立型設計模式,能夠複製已存在的對象而無需依賴它的類。java

問題

假如如今有一個對象,咱們想徹底複製一份新的,咱們該如何作?編程

  1. 建立同一個類的新對象
  2. 遍歷全部已存在對象的值,而後將他們的值複製到新對象。

很好,可是咱們會發現存在以下問題:設計模式

  1. 該對象的值並不必定全對對外開放,好比Java中的private,外部沒法訪問。
  2. 使用這種辦法必須知道該對象所屬的類並且依賴這個類。
  3. 有些時候咱們只知道該對象實現的接口,而不是具體的實現類。

解決

這個時候咱們就須要原型模式。原型模式將克隆過程委託給被克隆的對象。該模式爲全部支持克隆的對象聲明一個公共接口,這個接口容許克隆一個對象,而沒必要將代碼和該對象的類耦合。一般,這樣的接口只包含一個克隆方法。編程語言

克隆方法的實如今全部類中都很是類似。該方法建立當前類的一個對象,並將舊對象的全部字段值轉移到新對象中。這樣就能夠複製私有字段,由於大多數編程語言都容許對象訪問屬於同一類的私有字段。函數

結構

原型模式類圖

原型模式包含以下角色prototype

  • Prototype:它是聲明克隆方法的接口,是全部具體原型類的公共父類,能夠是抽象類也能夠是接口,甚至還能夠是具體實現類。
  • ConcretePrototype:它實如今抽象原型類中聲明的克隆方法,在克隆方法中返回本身的一個克隆對象

實例

在Java中,全部的類都繼承了java.lang.Object。Object提供了clone方法能實現Java對象複製。
咱們只需注意兩點便可。設計

  1. 實現克隆的Java類必須實現一個標識接口Cloneable,表示這個Java類支持被複制。若是沒有實現這個接口但調用了clone()方法,Java編譯器將拋出一個CloneNotSupportedException異常。
  2. 淺克隆和深克隆
    java的clone函數只是「淺克隆」,也就是僅對變量值作複製。若是是引用變量,其內容指向的內存地址是不變的。

參考文獻

https://refactoring.guru/design-patterns/prototype對象

相關文章
相關標籤/搜索