原型模式 Prototype Pattern

2021-09-24 03:30:53 字數 2476 閱讀 1755

開發中通常通過new關鍵字生成例項,必須指定類名,然而在下邊情況下,在 不指定類名的情況下生成例項,根據現有的例項生成新的例項。

類圖:

prduct

/**

* @author jay

* @date 2019/6/3 22:36

* @description 繼承複製介面,定義抽象方法

*/public

inte***ce

product

extends

cloneable

manager用介面來制定方法,則所有實現此介面的類都可以呼叫.新增新類時不需要再去修改方法內部.一旦使用了別的類名,將會與其他類緊密耦合在一起了。

/**

* @author jay

* @date 2019/6/3 22:47

* @description 定義註冊的規範

*/public

class

manager

/** * 定義獲取例項流程,通過介面制定規範,可以接受其全部實現類物件.

** @param protoname

* @return

*/public product create

(string protoname)

}

messageboxcreatclone()方法用來複製自己,若類實現複製介面或者介面繼承介面,只有在本類及其子類,或者實現此介面的類中呼叫clone(),否則只能通過方法呼叫。

/**

* @author jay

* @date 2019/6/3 22:58

* @description 具體例項建立的過程

*/public

class

messagebox

implements

product

@override

public

void

use(string s)

@override

public product createclone()

catch

(clonenotsupportedexception e)

return p;

}}

main

/**

* @author jay

* @date 2019/6/3 23:11

* @description

*/public

class

main

}

prototype(原型)負責定義用來複製現有例項來生成新例項的方法。

conncreteprototype(具體的原型)

繼承或者實現原型,具體實現複製現有例項來生成新例項的方法,同時不同的類具體實現介面中的方法。(模板方法模式)

client(使用者)

呼叫用來複製實現例項的方法,從而生成新的例項。註冊生成例項池,呼叫複製方法複製池中已有的例項,實現生成新的物件.

使用類名會出現的問題:

當類作為元件復用時,一旦****現要使用的類的名字,就無法與該類分離出來,無法實現**的復用,即若要使用其他類時必須重寫原始碼,但若是沒有原始碼程式,只有位元組碼程式,則無法實現程式的修改,因此,該類能否被復用,必須是不通過修改原始碼也可以完成,即沒有原始碼也可以完成復用。

物件導向程式設計的目標之一:作為元件的復用(.class檔案)

只有實現了cloneable介面的本類或者子類才可以呼叫clone(),此方法返回的是複製出的例項。

clone()內部處理:

分配與要複製的例項同樣大小的記憶體空間,將要複製的例項中的字段值複製到所分配的記憶體空間。

cloneable介面是標記介面,標記此類可以複製,其中並沒有clone()是object中有clone()方法。

clone()方法是淺複製

只是將複製例項的字段直接複製到新的例項中,並沒有考慮欄位中存的值,只會複製,並不會呼叫其建構函式。完全複製需要重寫clone()方法,並且呼叫super.clone()父類方法。

to github

建立型模式 原型模式

使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...

建立型模式 原型模式

原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...

原型模式 建立型模式

文章首發個人部落格 如果我們有乙個類 sheep 它裡面有兩個屬性,名稱 name 年齡 age 現在我們有乙個它的例項 s1 我們需要按照這個例項的屬性再去建立兩個物件。1 sheep data public class sheep 2 main public class main 原型模式 用原...