摘要:原型模式平行的繼承層次使用工廠模式在大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類(lèi)。上文中,稱(chēng)之為特殊的耦合在這里我們介紹一種其抽象工廠模式的變體原型模式。面向?qū)ο笤O(shè)計(jì)模式目錄
原型模式
平行的繼承層次使用工廠模式在:大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類(lèi)。(上文中,稱(chēng)之為“特殊的耦合”)
在這里我們介紹一種其抽象工廠模式的變體:原型模式。它使用clone關(guān)鍵詞,來(lái)復(fù)制具體產(chǎn)品類(lèi),使得具體產(chǎn)品類(lèi)能完成自我復(fù)制。
(通俗介紹:工場(chǎng)只負(fù)責(zé)生產(chǎn)產(chǎn)品,選擇生產(chǎn)何等產(chǎn)品,不再由工場(chǎng)自己決定,而是通過(guò)傳參,來(lái)確認(rèn)——對(duì)比抽象工廠,你可以發(fā)現(xiàn),我們?cè)僖舱也坏?strong>一大群具體產(chǎn)品的創(chuàng)建者,而只有一個(gè)高度靈活的創(chuàng)建者)
問(wèn)題假設(shè)我們?cè)谧鲆豢铑?lèi)似文明(Cicilization)的網(wǎng)頁(yè)游戲——這么經(jīng)典的游戲都沒(méi)玩過(guò)?成何體統(tǒng)[滑稽]。(屠龍寶刀,點(diǎn)擊就送!)
里面有個(gè) 戰(zhàn)斗用途的地理系統(tǒng)——三種地形:海洋 Sea/平原 Forest/森林 Plains,按照抽象工廠 + 工廠模式,我們肯定可以得到這樣的結(jié)果:
(為何我的眼里常含淚水,因?yàn)镾tartUML2.5難用的深沉)
但我們要避免“大型的繼承體系”——開(kāi)頭說(shuō)了,這會(huì)造成另類(lèi)耦合,于是,來(lái)看看原型模式的解決方法吧!
實(shí)現(xiàn)class Sea {} class EarthSea extends Sea {} class MarsSea extends Sea {} class Plains {} class EarthPlains extends Plains {} class MarsPlains extends Plains {} class Forest {} class EarthForest extends Forest {} class MarsForest extends Forest {} class TerrainFactory { private $sea; private $plains; private $forest; function __construct( Sea $sea, Plains $plains, Forest $forest ) { $this->sea = $sea; $this->plains = $plains; $this->forest = $forest; } function getSea() { return clone $this->sea; } function getPlains() { return clone $this->plains; } function getForest() { return clone $this->forest; } } $factory = new TerrainFactory( new EarthSea(), new EarthPlains(), new EarthForest() ); print_r( $factory->getSea() ); print_r( $factory->getPlains() ); print_r( $factory->getForest() );
讀完代碼,你就能看懂原型模式,創(chuàng)造者可以無(wú)腦的生產(chǎn)出一片“具備三種地形的戰(zhàn)斗區(qū)域”,你在地球風(fēng)格的海洋和森林。火星風(fēng)格的平原上戰(zhàn)斗?那么只需要傳遞三個(gè)對(duì)應(yīng)參數(shù)即可,換而言之——?jiǎng)?chuàng)造者不再負(fù)責(zé):我要造什么。
我們還可以增加一些靈活性,譬如:海洋地形中的航行難度——營(yíng)造出一種“索馬里海域 / 渤海海域”的差異(在古代,索馬里海域的航船條件相當(dāng)兇惡)。
class Sea { private $navigability = 0; function __construct( $navigability ) { $this->navigability = $navigability; } } ...省略部分代碼... $factory = new TerrainFactory( new EarthSea( -1 ), new EarthPlains(), new EarthForest() );
可以預(yù)見(jiàn),這是多么具備靈活性的模式。額外提及:如果產(chǎn)品類(lèi)包含了其他外部類(lèi),記得采用__clone()方法,這樣可以保證你得到的是深度復(fù)制(deep copy)
模式的誘導(dǎo)性本節(jié)沒(méi)有結(jié)論(或者,這個(gè)模式很好理解),這里提及一個(gè)模式的誘導(dǎo)和騙術(shù):它們并沒(méi)有幫你決定Create Who?
無(wú)論是工廠模式、抽象工廠模式,亦或是原型模式,它們都只是在技術(shù)層面簡(jiǎn)化了類(lèi)的數(shù)量、維護(hù)復(fù)雜度。
你還是需要自己決定:生產(chǎn)特定的產(chǎn)品——你會(huì)將這些決定留在整個(gè)代碼系統(tǒng),在你需要修改一處時(shí),造成癱瘓。
解決方案:操控單例類(lèi) / 存儲(chǔ)于數(shù)據(jù)庫(kù) / 甚至直接寫(xiě)到配置文件(.htaccess等)——包含大量的標(biāo)記/硬編碼;
個(gè)人推薦:?jiǎn)卫?lèi) + 配置文件,優(yōu)點(diǎn):方便修改、全局訪問(wèn)。
(面向?qū)ο笤O(shè)計(jì)模式 - 目錄)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/22674.html
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:系列目錄生成對(duì)象的模式面向?qū)ο蟮闹J絾卫嫦驅(qū)ο蟮闹J焦S方法面向?qū)ο蟮闹J匠橄蠊S方法面向?qū)ο蟮闹J皆徒M合類(lèi)對(duì)象的模式面向?qū)ο蟮闹J浇M合更新裝飾模式 系列目錄 生成對(duì)象的模式 【面向?qū)ο蟮腜HP】之模式:?jiǎn)卫?【面向?qū)ο蟮腜HP】之模式:工廠方法 【面向?qū)ο蟮腜HP】之模式:抽象工廠方法 【面向?qū)ο蟮腜HP】之模式:原型 組合類(lèi)/對(duì)象的模式 【面向?qū)ο蟮腜HP】之模式...
摘要:所以,也要慎用當(dāng)你的項(xiàng)目中,產(chǎn)品越來(lái)越多,創(chuàng)建者的數(shù)量也隨之臃腫,下一篇將介紹抽象工廠方法的變體原型模式,這種模式可以減少必須創(chuàng)建的類(lèi)。 抽象工廠方法模式 在工廠方法模式中,我們通過(guò)中間件的方式,形成了以下格式的分離: 使用者 ↓創(chuàng)建者 ↓具體產(chǎn)品 問(wèn)題 這樣,我們無(wú)論怎樣修正具體產(chǎn)品,都不會(huì)影響使用者。現(xiàn)在,我們可以做出來(lái)一群小工廠,他們有各自的產(chǎn)品,但形成了模式層面的重復(fù),那么...
閱讀 3067·2021-11-23 09:51
閱讀 1050·2021-09-02 15:21
閱讀 3014·2019-08-30 13:56
閱讀 1838·2019-08-29 14:12
閱讀 716·2019-08-29 13:53
閱讀 1676·2019-08-29 11:32
閱讀 1337·2019-08-29 11:25
閱讀 1501·2019-08-28 17:51