開發中通常通過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 原型模式 用原...