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