一. 概念
定義:Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型實(shí)例指定創(chuàng)建對象的種類诡延,并且通過拷貝這些原型創(chuàng)建新的對象。)
意圖:用原型實(shí)例指定創(chuàng)建對象的種類叔壤,并且通過拷貝這些原型創(chuàng)建新的對象。
主要解決:在運(yùn)行期建立和刪除原型甫菠。
何時(shí)使用: 1、當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建,構(gòu)成和表示時(shí)控乾。 2幔欧、當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí)罪治,例如,通過動(dòng)態(tài)裝載礁蔗。 3觉义、為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí)。 4浴井、當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)晒骇。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。
如何解決:利用已有的一個(gè)原型對象磺浙,快速地生成和原型對象一樣的實(shí)例洪囤。
關(guān)鍵代碼: 1、實(shí)現(xiàn)克隆操作撕氧,在 JAVA 繼承 Cloneable瘤缩,重寫 clone(),在 .NET 中可以使用 Object 類的 MemberwiseClone() 方法來實(shí)現(xiàn)對象的淺拷貝或通過序列化的方式來實(shí)現(xiàn)深拷貝呵曹。 2款咖、原型模式同樣用于隔離類對象的使用者和具體類型(易變類)之間的耦合關(guān)系,它同樣要求這些"易變類"擁有穩(wěn)定的接口奄喂。
應(yīng)用實(shí)例: 1铐殃、細(xì)胞分裂。 2跨新、JAVA 中的 Object clone() 方法富腊。
優(yōu)點(diǎn): 1、性能提高域帐。 2赘被、逃避構(gòu)造函數(shù)的約束。
缺點(diǎn): 1肖揣、配備克隆方法需要對類的功能進(jìn)行通盤考慮民假,這對于全新的類不是很難,但對于已有的類不一定很容易龙优,特別當(dāng)一個(gè)類引用不支持串行化的間接對象羊异,或者引用含有循環(huán)結(jié)構(gòu)的時(shí)候。 2、必須實(shí)現(xiàn) Cloneable 接口野舶。 3易迹、逃避構(gòu)造函數(shù)的約束。
使用場景: 1平道、資源優(yōu)化場景睹欲。 2、類初始化需要消化非常多的資源一屋,這個(gè)資源包括數(shù)據(jù)窘疮、硬件資源等。 3陆淀、性能和安全要求的場景考余。 4先嬉、通過 new 產(chǎn)生一個(gè)對象需要非常繁瑣的數(shù)據(jù)準(zhǔn)備或訪問權(quán)限轧苫,則可以使用原型模式。 5疫蔓、一個(gè)對象多個(gè)修改者的場景含懊。 6、一個(gè)對象需要提供給其他對象訪問衅胀,而且各個(gè)調(diào)用者可能都需要修改其值時(shí)岔乔,可以考慮使用原型模式拷貝多個(gè)對象供調(diào)用者使用。 7滚躯、在實(shí)際項(xiàng)目中雏门,原型模式很少單獨(dú)出現(xiàn),一般是和工廠方法模式一起出現(xiàn)掸掏,通過 clone 的方法創(chuàng)建一個(gè)對象茁影,然后由工廠方法提供給調(diào)用者。原型模式已經(jīng)與 Java 融為渾然一體丧凤,大家可以隨手拿來使用募闲。
注意事項(xiàng):與通過對一個(gè)類進(jìn)行實(shí)例化來構(gòu)造新對象不同的是,原型模式是通過拷貝一個(gè)現(xiàn)有對象生成新對象的愿待。淺拷貝實(shí)現(xiàn) Cloneable浩螺,重寫,深拷貝是通過實(shí)現(xiàn) Serializable 讀取二進(jìn)制流
二. 場景
三. 代碼
偽代碼仍侥,java中需要兩種類要出,實(shí)現(xiàn)clonable接口的抽象父類,
python則非常簡單农渊,copy.deepcopy方法患蹂,或者對象.class(參數(shù)) 兩種方式。