摘要:所以,也要慎用當(dāng)你的項(xiàng)目中,產(chǎn)品越來(lái)越多,創(chuàng)建者的數(shù)量也隨之臃腫,下一篇將介紹抽象工廠(chǎng)方法的變體原型模式,這種模式可以減少必須創(chuàng)建的類(lèi)。
抽象工廠(chǎng)方法模式
在工廠(chǎng)方法模式中,我們通過(guò)中間件的方式,形成了以下格式的分離:
使用者
↓
創(chuàng)建者
↓
具體產(chǎn)品
這樣,我們無(wú)論怎樣修正具體產(chǎn)品,都不會(huì)影響使用者?,F(xiàn)在,我們可以做出來(lái)一群小工廠(chǎng),他們有各自的產(chǎn)品,但形成了模式層面的重復(fù),那么我們?nèi)绾位膺@種重復(fù)呢?
在本篇,將通過(guò)抽象工廠(chǎng)方法模式——抽象 - 工廠(chǎng)方法 - 模式,來(lái)完成對(duì)小公司的整合,最初設(shè)計(jì)(母公司 - 子公司):
接下來(lái),我們要通過(guò)抽象類(lèi)解決多個(gè)業(yè)務(wù)并行的問(wèn)題。
現(xiàn)在,我們要寫(xiě)一個(gè)PIM的數(shù)據(jù)格式解碼器 - Personal Information Manage,會(huì)產(chǎn)生預(yù)約(Appt)、待辦事宜(Ttd)、聯(lián)系人(Contact)三種數(shù)據(jù)格式。
我們就可以設(shè)計(jì)出下列UML:
通過(guò)CommsManager抽象類(lèi),我們可以生成具體的所有子公司(子類(lèi))。
但事實(shí)上,這也一定程度的顯示了為什么有些公司做不好某些行業(yè),一旦他哪怕是間接介入子公司,也會(huì)影響子公司的血統(tǒng)(這個(gè)想法我最早接觸于吳軍先生的《浪潮之巔》)。
實(shí)現(xiàn)abstract class CommsManager { abstract function getHeaderText(); abstract function getApptEncoder(); abstract function getTtdEncoder(); abstract function getConteactEncoder(); abstract function getFootText(); } class BloggsCommsManager extends CommsManager { function getHeaderText() { return "BloggsCal header "; } function getApptEncoder() { return new BloggsApptEncoder(); } function getTtdEncoder() { return new BloggsTtdEncoder(); } function getConteactEncoder() { return new BloggsConteactEncoder(); } function getFootText() { return "BloggsCal footer "; } }
在這里,我們用了工廠(chǎng)模式(目錄在最后)。設(shè)計(jì)模式之間經(jīng)常這樣協(xié)作,一個(gè)模式的創(chuàng)建,可以成為另一個(gè)模式的一部分。
這方面的想法就是源于模式本身:他是經(jīng)過(guò)無(wú)數(shù)次同條件下,實(shí)踐得出的最優(yōu)解——未來(lái)如果有更好的條件,這個(gè)最優(yōu)解就仍然有優(yōu)化的空間 / 或者沒(méi)有存在的。
結(jié)果模式的意義:
徹底的將 業(yè)務(wù)需求 與 實(shí)現(xiàn)細(xì)節(jié) 分割,現(xiàn)在,我們可以隨意的改動(dòng)編碼格式,而不用擔(dān)心業(yè)務(wù)層產(chǎn)生BUG;
通過(guò)強(qiáng)制整合,所有Blogger格式的內(nèi)容,都通過(guò)Blogger創(chuàng)建者類(lèi)來(lái)實(shí)現(xiàn),不會(huì)出錯(cuò);
當(dāng)然,添加新產(chǎn)品則是令人苦惱的,為了創(chuàng)建新產(chǎn)品的具體實(shí)現(xiàn),我們必須修改抽象創(chuàng)建者、和他的每一個(gè)具體實(shí)現(xiàn)。
PHP目前還沒(méi)有強(qiáng)制規(guī)定 方法的返回類(lèi)型,這產(chǎn)生了一些額外的靈活性。(強(qiáng)制規(guī)定返回類(lèi)型,一般為JAVA之類(lèi)的 強(qiáng)類(lèi)型-面向?qū)ο?語(yǔ)言)
abstract class CommsManager { const APPT = 1; const TTD = 2; const CONTACT = 3; abstract function getHeaderText(); abstract function mark( $flag_int ); abstract function getFootText(); } class BloggsCommsManager extends CommsManager { function getHeaderText() { return "BloggsCal header "; } function mark( $flag_int ) { switch ($flag_int) { case self::APPT: return new BloggsApptEncoder(); case self::TTD: return new BloggsTtdEncoder(); case self::CONTACT: return new BloggsConteactEncoder(); } } function getFootText() { return "BloggsCal footer "; } }
類(lèi)的接口變得更加緊湊,但也有一定的代價(jià),我們放棄了詳細(xì)的數(shù)據(jù)格式方法,而是將其中心化了,客戶(hù)無(wú)法確認(rèn)是否實(shí)現(xiàn)了需要的具體產(chǎn)品。
所以,也要慎用~
當(dāng)你的項(xiàng)目中,產(chǎn)品越來(lái)越多,創(chuàng)建者的數(shù)量也隨之臃腫,下一篇將介紹抽象工廠(chǎng)方法的變體:原型模式,這種模式可以減少必須創(chuàng)建的類(lèi)。
面向?qū)ο笤O(shè)計(jì)模式 - 目錄
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://hztianpu.com/yun/22580.html
摘要:工廠(chǎng)方法模式面向?qū)ο蟮脑O(shè)計(jì)強(qiáng)調(diào)抽象類(lèi)高于實(shí)踐,盡可能的將代碼設(shè)計(jì)的一般化,而非特殊化也就是降低耦合,提升標(biāo)準(zhǔn)性。于是,前輩們便設(shè)計(jì)了特定類(lèi)處理實(shí)例化的工廠(chǎng)方法。實(shí)現(xiàn)這個(gè)時(shí)候我們引入工廠(chǎng)方法模式,設(shè)置類(lèi)創(chuàng)造者,類(lèi)產(chǎn)品,。面向?qū)ο笤O(shè)計(jì)模式目錄 工廠(chǎng)方法模式 面向?qū)ο蟮脑O(shè)計(jì)強(qiáng)調(diào)抽象類(lèi)高于實(shí)踐,盡可能的將代碼設(shè)計(jì)的一般化,而非特殊化——也就是降低耦合,提升標(biāo)準(zhǔn)性。于是,前輩們便設(shè)計(jì)了特定類(lèi)處理...
摘要:原型模式平行的繼承層次使用工廠(chǎng)模式在大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類(lèi)。上文中,稱(chēng)之為特殊的耦合在這里我們介紹一種其抽象工廠(chǎng)模式的變體原型模式。面向?qū)ο笤O(shè)計(jì)模式目錄 原型模式 平行的繼承層次使用工廠(chǎng)模式在:大型設(shè)計(jì)中,必須去維護(hù)大量的產(chǎn)品類(lèi)。(上文中,稱(chēng)之為特殊的耦合) 在這里我們介紹一種其抽象工廠(chǎng)模式的變體:原型模式。它使用clone關(guān)鍵詞,來(lái)復(fù)制具體產(chǎn)品類(lèi),使得具體產(chǎn)品類(lèi)能完成自我...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類(lèi) Collections 中大概有兩類(lèi)功能,第一類(lèi)是對(duì)容器接口對(duì)象進(jìn)行操作,第二類(lèi)是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:面向?qū)ο笤O(shè)計(jì)的五大原則單一職責(zé)原則接口隔離原則開(kāi)放封閉原則替換原則依賴(lài)倒置原則。主要是針對(duì)繼承的設(shè)計(jì)原則,繼承與派生多態(tài)是的主要特性。 面向?qū)ο笤O(shè)計(jì)的五大原則:?jiǎn)我宦氊?zé)原則、接口隔離原則、開(kāi)放-封閉原則、替換原則、依賴(lài)倒置原則。這些原則主要是由Robert C.Martin在《敏捷軟件開(kāi)發(fā)——原則、方法、與實(shí)踐》一書(shū)中總結(jié)出來(lái),這五大原則也是23種設(shè)計(jì)模式的基礎(chǔ)。 單一職責(zé)原則 Sin...
閱讀 1286·2019-08-30 15:55
閱讀 1033·2019-08-30 15:55
閱讀 2238·2019-08-30 15:44
閱讀 3027·2019-08-29 14:17
閱讀 1216·2019-08-29 12:45
閱讀 3397·2019-08-26 10:48
閱讀 3213·2019-08-23 18:18
閱讀 2707·2019-08-23 16:47