java設計模式 - 原型模式

1.定義

用一個已經(jīng)創(chuàng)建的實例作為原型崖媚,通過復制該原型對象來創(chuàng)建一個和原型相同或相似的新對象。在這里脯燃,原型實例指定了要創(chuàng)建的對象的種類淳附。用這種方式創(chuàng)建對象非常高效议慰,根本無須知道對象創(chuàng)建的細節(jié)

例如,Windows 操作系統(tǒng)的安裝通常較耗時奴曙,如果復制就快了很多别凹。在生活中復制的例子非常多,這里不一一列舉了


2.優(yōu)缺點

原型模式的優(yōu)點:

  • Java自帶的原型模式基于內存二進制流的復制洽糟,在性能上比直接·new一個對象更加優(yōu)良炉菲。
  • 可以使用深克隆方式保存對象的狀態(tài),使用原型模式將對象復制一份坤溃,并將其狀態(tài)保存起來拍霜,簡化了創(chuàng)建對象的過程,以便在需要的時候使用(例如恢復到歷史某一狀態(tài))薪介,可輔助實現(xiàn)撤銷操作祠饺。

原型模式的缺點:

  • 需要為每一個類都配置一個 clone方法
  • clone 方法位于類的內部,當對已有類進行改造的時候汁政,需要修改代碼道偷,違背了開閉原則缀旁。
  • 當實現(xiàn)深克隆時,需要編寫較為復雜的代碼勺鸦,而且當對象之間存在多重嵌套引用時并巍,為了實現(xiàn)深克隆,每一層對象對應的類都必須支持深克隆换途,實現(xiàn)起來會比較麻煩履澳。因此,深克隆怀跛、淺克隆需要運用得當。

3.結構

原型模式包含以下主要角色:

  • 抽象原型類:規(guī)定了具體原型對象必須實現(xiàn)的接口柄冲。
  • 具體原型類:實現(xiàn)抽象原型類的 clone() 方法吻谋,它是可被復制的對象。
  • 訪問類:使用具體原型類中的 clone() 方法來復制新的對象现横。
結構圖.png

4.示例代碼

原型模式的克隆分為淺克隆和深克隆漓拾。

  • 淺克隆:創(chuàng)建一個新對象,新對象的屬性和原來對象完全相同戒祠,對于非基本類型屬性骇两,仍指向原有屬性所指向的對象的內存地址。
  • 深克隆:創(chuàng)建一個新對象姜盈,屬性中引用的其他對象也會被克隆低千,不再指向原有對象地址。

Java 中的 Object 類提供了淺克隆的 clone() 方法馏颂,具體原型類只要實現(xiàn) Cloneable 接口就可實現(xiàn)對象的淺克隆示血,這里的 Cloneable 接口就是抽象原型類。其代碼如下:

//具體原型類
class Realizetype implements Cloneable {
    Realizetype() {
        System.out.println("具體原型創(chuàng)建成功救拉!");
    }
    public Object clone() throws CloneNotSupportedException {
        System.out.println("具體原型復制成功难审!");
        return (Realizetype) super.clone();
    }
}
//原型模式的測試類
public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        Realizetype obj1 = new Realizetype();
        Realizetype obj2 = (Realizetype) obj1.clone();
        System.out.println("obj1==obj2?" + (obj1 == obj2));
    }
}

執(zhí)行結果如下:

具體原型創(chuàng)建成功!
具體原型復制成功亿絮!
obj1==obj2?false

5.參考

原型模式

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末告喊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子派昧,更是在濱河造成了極大的恐慌黔姜,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒂萎,死亡現(xiàn)場離奇詭異地淀,居然都是意外死亡,警方通過查閱死者的電腦和手機岖是,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門帮毁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实苞,“玉大人,你說我怎么就攤上這事烈疚∏#” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵爷肝,是天一觀的道長猾浦。 經(jīng)常有香客問我,道長灯抛,這世上最難降的妖魔是什么金赦? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮对嚼,結果婚禮上夹抗,老公的妹妹穿的比我還像新娘。我一直安慰自己纵竖,他們只是感情好漠烧,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著靡砌,像睡著了一般已脓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上通殃,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天度液,我揣著相機與錄音,去河邊找鬼画舌。 笑死恨诱,一個胖子當著我的面吹牛,可吹牛的內容都是我干的骗炉。 我是一名探鬼主播照宝,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼句葵!你這毒婦竟也來了厕鹃?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤乍丈,失蹤者是張志新(化名)和其女友劉穎剂碴,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轻专,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡忆矛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片催训。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡洽议,死狀恐怖,靈堂內的尸體忽然破棺而出漫拭,到底是詐尸還是另有隱情亚兄,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布采驻,位于F島的核電站审胚,受9級特大地震影響,放射性物質發(fā)生泄漏礼旅。R本人自食惡果不足惜膳叨,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痘系。 院中可真熱鬧菲嘴,春花似錦、人聲如沸碎浇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奴璃。三九已至,卻和暖如春城豁,著一層夾襖步出監(jiān)牢的瞬間苟穆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工唱星, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雳旅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓间聊,卻偏偏與公主長得像攒盈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哎榴,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容