摘要:工廠方法模式面向?qū)ο蟮脑O(shè)計(jì)強(qiáng)調(diào)抽象類高于實(shí)踐,盡可能的將代碼設(shè)計(jì)的一般化,而非特殊化也就是降低耦合,提升標(biāo)準(zhǔn)性。于是,前輩們便設(shè)計(jì)了特定類處理實(shí)例化的工廠方法。實(shí)現(xiàn)這個(gè)時(shí)候我們引入工廠方法模式,設(shè)置類創(chuàng)造者,類產(chǎn)品,。面向?qū)ο笤O(shè)計(jì)模式目錄
工廠方法模式
面向?qū)ο蟮脑O(shè)計(jì)強(qiáng)調(diào)“抽象類高于實(shí)踐”,盡可能的將代碼設(shè)計(jì)的一般化,而非特殊化——也就是降低耦合,提升標(biāo)準(zhǔn)性。于是,前輩們便設(shè)計(jì)了“特定類處理實(shí)例化”的工廠方法。
問(wèn)題Appointment類需要解析BloggsCal數(shù)據(jù)格式,在類內(nèi)部,我們將數(shù)據(jù)格式寫(xiě)死為BloggsCal,這將會(huì)造成耦合,而且實(shí)際上,未來(lái)業(yè)務(wù)需求要面臨更多的數(shù)據(jù)格式。
實(shí)現(xiàn)這個(gè)時(shí)候我們引入工廠方法模式,設(shè)置CommsManager類(創(chuàng)造者,creater)、ApptEncoder類(產(chǎn)品,Product)。
接下來(lái),用戶只需要調(diào)用CommsManager對(duì)象的getApptEncoder方法,就可以得到他們需要的對(duì)象,而無(wú)需關(guān)注這個(gè)對(duì)象到底是哪種數(shù)據(jù)格式。
abstract class ApptEncoder { abstract function encode(); } class BloggsApptEncoder extends ApptEncoder { function encode() { return "數(shù)據(jù)格式為BloggsCal。"; } } class MegaApptEncoder extends ApptEncoder { function encode() { return "數(shù)據(jù)格式為MegaCal。"; } } class CommsManager { const BLOGGS = 1; const MEGA = 2; private $mode = 1; function __construct( $mode ) { $this->mode = $mode; } function getApptEncoder() { switch ( $this->mode ) { case ( self::MEGA ) : return new MegaApptEncoder(); default: return new BloggsApptEncoder(); } } function getHeaderText() { switch ( $this->mode ) { case ( self::MEGA ): return "Mega格式的表頭"; default: return "BloggsCal格式的表頭"; } } function getFootText() { switch ( $this->mode ) { case ( self::MEGA ): return "Mega格式的腳頁(yè)"; default: return "BloggsCal格式的腳頁(yè)"; } } } $comms = new CommsManager( CommsManager::MEGA ); $apptEncoder = $comms->getApptEncoder(); echo $apptEncoder->encode();
注意到CommsManager類的三個(gè)getXXX方法了嗎?
一旦數(shù)據(jù)格式增多、功能增加、數(shù)據(jù)格式間存在業(yè)務(wù)差異,就會(huì)造成一個(gè)新問(wèn)題:大量的判斷語(yǔ)句——包括我自己在內(nèi)的一些人認(rèn)為,這是代碼腐爛的象征。
至少,當(dāng)重復(fù)的代碼開(kāi)始蔓延,我們不應(yīng)該感到樂(lè)觀。(盡管下面的處理方法,在一定程度上也重復(fù)了這個(gè)錯(cuò)誤)
面對(duì)上述難題,我們有了下列三條要求:
在代碼運(yùn)行時(shí),才能了解我們要生成的對(duì)象類型(實(shí)時(shí)傳參,注意那句:$comms = new CommsManager( CommsManager::MEGA ));
相對(duì)輕松的加入新數(shù)據(jù)格式(Product);
每個(gè)產(chǎn)品類型都能輕松加入訂制化功能。
既然如此,我們干脆將 數(shù)據(jù)格式們 從CommsManager中剝離出來(lái),形成多帶帶的子類。
// 產(chǎn)品抽象類、子類的代碼,同上。 abstract class CommsManager { abstract function getApptEncoder(); abstract function getHeaderText(); abstract function getFooterText(); } class BloggsCommsManager extends CommsManager { function getApptEncoder() { return new BloggsApptEncoder(); } function getHeaderText() { return "BloggsCal格式的表頭"; } function getFooterText() { return "BloggsCal格式的腳頁(yè)"; } } class MegaCommsManager extends CommsManager { function getApptEncoder() { return new MegaApptEncoder(); } function getHeaderText() { return "MegaCal格式的表頭"; } function getFooterText() { return "MegaCal格式的腳頁(yè)"; } } $comms = new BloggsCommsManager(); $apptEncoder = $comms->getApptEncoder(); echo $apptEncoder->encode();結(jié)果
這樣滿足了上述的三個(gè)要求,可我想,聰明的你已經(jīng)注意到了:一定程度上,創(chuàng)建者/產(chǎn)品們 產(chǎn)生了代碼重復(fù)。而且,問(wèn)題被轉(zhuǎn)移到了工廠方法中,我們目前只是處理了Appointment功能,如果我們加入TodoList功能呢?
答案很明顯,我們需要:可以同時(shí)處理一組相關(guān)實(shí)現(xiàn)的架構(gòu),解決之道就在下一篇文章:抽象工廠模式。
(面向?qū)ο笤O(shè)計(jì)模式 - 目錄)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/22553.html
摘要:所以,也要慎用當(dāng)你的項(xiàng)目中,產(chǎn)品越來(lái)越多,創(chuàng)建者的數(shù)量也隨之臃腫,下一篇將介紹抽象工廠方法的變體原型模式,這種模式可以減少必須創(chuàng)建的類。 抽象工廠方法模式 在工廠方法模式中,我們通過(guò)中間件的方式,形成了以下格式的分離: 使用者 ↓創(chuàng)建者 ↓具體產(chǎn)品 問(wèn)題 這樣,我們無(wú)論怎樣修正具體產(chǎn)品,都不會(huì)影響使用者?,F(xiàn)在,我們可以做出來(lái)一群小工廠,他們有各自的產(chǎn)品,但形成了模式層面的重復(fù),那么...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:原型模式平行的繼承層次使用工廠模式在大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類。上文中,稱之為特殊的耦合在這里我們介紹一種其抽象工廠模式的變體原型模式。面向?qū)ο笤O(shè)計(jì)模式目錄 原型模式 平行的繼承層次使用工廠模式在:大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類。(上文中,稱之為特殊的耦合) 在這里我們介紹一種其抽象工廠模式的變體:原型模式。它使用clone關(guān)鍵詞,來(lái)復(fù)制具體產(chǎn)品類,使得具體產(chǎn)品類能完成自我...
摘要:系列目錄生成對(duì)象的模式面向?qū)ο蟮闹J絾卫嫦驅(qū)ο蟮闹J焦S方法面向?qū)ο蟮闹J匠橄蠊S方法面向?qū)ο蟮闹J皆徒M合類對(duì)象的模式面向?qū)ο蟮闹J浇M合更新裝飾模式 系列目錄 生成對(duì)象的模式 【面向?qū)ο蟮腜HP】之模式:?jiǎn)卫?【面向?qū)ο蟮腜HP】之模式:工廠方法 【面向?qū)ο蟮腜HP】之模式:抽象工廠方法 【面向?qū)ο蟮腜HP】之模式:原型 組合類/對(duì)象的模式 【面向?qū)ο蟮腜HP】之模式...
閱讀 4737·2021-10-13 09:39
閱讀 557·2021-09-06 15:02
閱讀 3321·2019-08-30 15:53
閱讀 1115·2019-08-30 13:04
閱讀 2223·2019-08-30 11:27
閱讀 2086·2019-08-26 13:51
閱讀 2198·2019-08-26 11:33
閱讀 2984·2019-08-26 10:36