給人看的Kotlin設(shè)計(jì)模式——原型模式

原型設(shè)計(jì)模式是一種很簡(jiǎn)單的設(shè)計(jì)模式首昔,其實(shí)就是通過(guò)clone方法去復(fù)制一個(gè)對(duì)象,也就是Java中的Cloneable接口。原型模式是很多語(yǔ)言的特性之一绎签,包括Java和Kotlin。

核心思想:復(fù)制代替構(gòu)造酝锅。

Java Cloneable

原型設(shè)計(jì)模式對(duì)應(yīng)了Effective Java的第十三條謹(jǐn)慎覆蓋clone诡必。

Cloneable 接口并沒(méi)有包含任何方法,那么它到底有什么作用呢搔扁?它決定了 Object中受保護(hù)的 clone方法實(shí)現(xiàn)的行為:如果一個(gè)類實(shí)現(xiàn)了 Cloneable, Object 的 clone方法就返回該對(duì)象的逐域拷貝爸舒,否則就會(huì)拋出 CloneNotSupportedException 異常。這是接口的一種極端非典型的用法稿蹲,也不值得仿效 扭勉。 通常情況下,實(shí)現(xiàn)接口是為了表明類可以為它的客戶做些什么 。 然而,對(duì)于 Cloneable 接口,它改變了超類中受保護(hù)的方法的行為觉至。事實(shí)上璧尸,實(shí)現(xiàn) Cloneable 接口的類是為了提供一個(gè)功能適當(dāng)?shù)墓械?clone 方法 咒林。
實(shí)際上,clone 方法就是另一個(gè)構(gòu)造器爷光;必須確保它不會(huì)傷害到原始的對(duì)象垫竞,并確保正確地創(chuàng)建被克隆對(duì)象中的約束條件(invariant)。
簡(jiǎn)而言之蛀序,所有實(shí)現(xiàn)了 Cloneable 接口的類都應(yīng)該覆蓋 clone 方法欢瞪,并且是公有的方法,它的返回類型為類本身徐裸。 該方法應(yīng)該先調(diào)用 super.clone 方法遣鼓,然后修正任何需要修正的域 。 一般情況下重贺,這意味著要拷貝任何包含內(nèi)部“深層結(jié)構(gòu)”的可變對(duì)象骑祟,并用指向新對(duì)象的引用代替原來(lái)指向這些對(duì)象的引用 。 雖然气笙,這些內(nèi)部拷貝操作往往可以通過(guò)遞歸地調(diào)用 clone 來(lái)完成次企,但這通常并不是最佳方法 。 如果該類只包含基本類型的域潜圃,或者指向不可變對(duì)象的引用缸棵,那么多半的情況是沒(méi)有域需要修正 。 這條規(guī)則也有例外 谭期。 例如堵第,代表序列號(hào)或其他唯一 ID 值的域,不管這些域是基本類型還是不可變的隧出,它們也都需要被修正型诚。
最好提供某些其他的途徑來(lái)代替對(duì)象拷貝。 對(duì)象拷貝的更好的辦法是提供一個(gè)拷貝構(gòu)造器(copy constructor)或拷貝工廠(copy factory)鸳劳。拷貝構(gòu)造器的做法也搓,及其靜態(tài)工廠方法的變形赏廓,都比 Cloneable/clone 方法具有更多的優(yōu)勢(shì):它們不依賴于某一種很有風(fēng)險(xiǎn)的、語(yǔ)言之外的對(duì)象創(chuàng)建機(jī)制傍妒;它們不要求遵守尚未制定好文檔的規(guī)范幔摸;它們不會(huì)與 final 域的正常使用發(fā)生沖突;它們不會(huì)拋出不必要的受檢異常颤练;它們不需要進(jìn)行類型轉(zhuǎn)換既忆。
既然所有的問(wèn)題都與 Cloneable 接口有關(guān),新的接口就不應(yīng)該擴(kuò)展這個(gè)接口,新的可擴(kuò)展的類也不應(yīng)該實(shí)現(xiàn)這個(gè)接口患雇。雖然 final 類實(shí)現(xiàn) Cloneable 接 口沒(méi)有太大的危害跃脊,這個(gè)應(yīng)該被視同性能優(yōu)化,留到少數(shù)必要的情況下才使用苛吱。 總之酪术,復(fù)制功能最好由構(gòu)造器或者工廠提供 。 這條規(guī)則最絕對(duì)的例外是數(shù)組翠储,最好利用 clone 方法復(fù)制數(shù)組绘雁。

Effective Java關(guān)于clone講了非常多,以上是其核心內(nèi)容援所,簡(jiǎn)單來(lái)說(shuō)就是不應(yīng)該使用Cloneable接口庐舟,而應(yīng)該考慮使用拷貝構(gòu)造器(copy constructor)或拷貝工廠(copy factory)來(lái)代替,這些是說(shuō)給誰(shuí)聽的住拭,當(dāng)然是說(shuō)給Kotlin聽的挪略,于是乎Kotlin在其data class中遵循了這樣的建議,提供了方便的copy方法废酷,copy方法其實(shí)就相當(dāng)于一個(gè)拷貝工廠瘟檩,不過(guò),需要注意的是澈蟆,copy方法實(shí)現(xiàn)的是淺拷貝墨辛,有些時(shí)候需要深拷貝,這就需要我們自己來(lái)實(shí)現(xiàn)趴俘,可以參考也許你需要這個(gè)為數(shù)據(jù)類生成 DeepCopy 方法的庫(kù)睹簇。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寥闪,隨后出現(xiàn)的幾起案子太惠,更是在濱河造成了極大的恐慌,老刑警劉巖疲憋,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿渊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡缚柳,警方通過(guò)查閱死者的電腦和手機(jī)埃脏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秋忙,“玉大人彩掐,你說(shuō)我怎么就攤上這事』易罚” “怎么了堵幽?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵狗超,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我朴下,道長(zhǎng)努咐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任桐猬,我火速辦了婚禮麦撵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溃肪。我一直安慰自己免胃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布惫撰。 她就那樣靜靜地躺著羔沙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪厨钻。 梳的紋絲不亂的頭發(fā)上扼雏,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音夯膀,去河邊找鬼诗充。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诱建,可吹牛的內(nèi)容都是我干的蝴蜓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼俺猿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼茎匠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起押袍,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诵冒,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谊惭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汽馋,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年圈盔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豹芯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡药磺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出煤伟,到底是詐尸還是另有隱情癌佩,我是刑警寧澤木缝,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站围辙,受9級(jí)特大地震影響我碟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姚建,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一矫俺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掸冤,春花似錦厘托、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至饺藤,卻和暖如春包斑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涕俗。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工罗丰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人再姑。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓萌抵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親询刹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谜嫉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355