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