成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Chap3:創(chuàng)建型設(shè)計(jì)模式————工廠方法設(shè)計(jì)模式(上)

A Loity / 2871人閱讀

摘要:利用工廠方法模式,請求者發(fā)出請求,而不具體創(chuàng)建產(chǎn)品。正是因?yàn)檫@個(gè)原因,使用工廠方法模式可以簡化復(fù)雜的創(chuàng)建過程,關(guān)鍵就在于它在維持一個(gè)公共接口。

創(chuàng)建型設(shè)計(jì)模式

包括以下五種:

抽象工廠

生成器

工廠方法

原型

單例

我們選擇工廠方法和原型模式作為將用PHP實(shí)現(xiàn)的創(chuàng)建型設(shè)計(jì)的例子
工廠方法模式是這5個(gè)設(shè)計(jì)模式中唯一的一種類設(shè)計(jì)模式
原型模式屬于對象類模式,可以使用PHP_clone方法實(shí)現(xiàn)。首先基于原型實(shí)例化(創(chuàng)建)一個(gè)對象,然后由這個(gè)實(shí)例化對象進(jìn)一步克隆其他對象
使用創(chuàng)建型模式時(shí),最有意思的是,當(dāng)程序和系統(tǒng)越來越依賴于對象組合而不是依賴于類繼承時(shí),創(chuàng)建型模式中的程序變成由對象構(gòu)成的系統(tǒng),而對象又由其他對象組合而成,所以任何單個(gè)對象的創(chuàng)建都不應(yīng)該依賴于創(chuàng)建者

工廠方法模式

概念:工廠方法模式就是要?jiǎng)?chuàng)建某種東西,對于工廠方法模式,要?jiǎng)?chuàng)建的東西是一個(gè)產(chǎn)品,這個(gè)產(chǎn)品與創(chuàng)建它的類之間不存在綁定,為了保持這種松耦合,客戶會通過一個(gè)工廠發(fā)出請求,再由工廠創(chuàng)建所請求的產(chǎn)品。利用工廠方法模式,請求者發(fā)出請求,而不具體創(chuàng)建產(chǎn)品。
何時(shí)使用:如果實(shí)例化對象的子類可能變化,就要使用工廠方法模式
Why:對象的數(shù)目和類型都是未知的,一個(gè)類無法預(yù)計(jì)它要?jiǎng)?chuàng)建的對象數(shù)目,所以你不希望類與它要?jiǎng)?chuàng)建的類緊密綁定

案例模型:

步驟:

第一步是建立工廠:Creator接口

factoryMethod();
        return $mfg;
    }
}
?>

注意到,偽代碼注釋提示startFactory()方法需要返回一個(gè)產(chǎn)品(product),在實(shí)現(xiàn)中startFactory()希望factoryMethod()返回一個(gè)產(chǎn)品對象,所以,factoryMethod()的具體實(shí)現(xiàn)要構(gòu)建并返回由一個(gè)按Product接口實(shí)現(xiàn)的產(chǎn)品對象

下面有兩個(gè)工廠類擴(kuò)展了Creator,并實(shí)現(xiàn)了factoryMethod()方法,factoryMethod()實(shí)現(xiàn)通過一個(gè)Product方法(getProperties())返回一個(gè)文本或圖像產(chǎn)品,TextFactory和GraphicFactory實(shí)現(xiàn)中加入了這些內(nèi)容

getProperties());
    }
}
?>
getProperties());
    }
}
?>

工廠方法設(shè)計(jì)模式中的第二個(gè)接口是Product。由于這是第一個(gè)實(shí)現(xiàn),也是最簡單的實(shí)現(xiàn),所有文本和圖像屬性都只實(shí)現(xiàn)一個(gè)方法getProperties():建立方法而無屬性,我們可以明確想要用這個(gè)方法做什么(比如可以有個(gè)返回值),只要方法名和可見性與簽名一致就不會有問題

可以利用這個(gè)實(shí)現(xiàn),使得同一個(gè)方法getProperties()多態(tài),分別返回圖像和文字,如下所示

mfgProduct = "This is a TextmfgProduct;
    }
}
?>
mfgProduct = "This is a Graphic
"; return $this->mfgProduct; } } ?>

上面你看到的This is a Graphic以及This is text,可以替換成你想放入的其它東西,工廠設(shè)計(jì)會創(chuàng)建這個(gè)對象,并把它返回給Client來使用。
這兩個(gè)工廠和產(chǎn)品分別覆蓋了抽象方法,來創(chuàng)建兩個(gè)不同的工廠和產(chǎn)品,它們都符合所實(shí)現(xiàn)的接口

客戶
這個(gè)模式最后一個(gè)參與者是隱含的(上面模型圖中顏色較淡的框):客戶。我們并不希望Client類直接做出產(chǎn)品請求。實(shí)際上,我們希望能夠通過Creator接口做出請求,這樣一來,如果以后我們增加產(chǎn)品或者工廠,客戶可以做同樣的請求來得到更多類型的產(chǎn)品,而不會破壞這個(gè)應(yīng)用

someGraphicObject = new GraphicFactory();
        echo $this->someGraphicObject->startFactory();
         $this->someTextObject = new TextFactory();
        echo $this->someTextObject->startFactory();
    }
}
$worker = new Client();
?>

注意Client對象并沒有向產(chǎn)品直接做出請求,而是通過工廠來請求,重要的是,客戶并不實(shí)現(xiàn)產(chǎn)品特性,而留給產(chǎn)品實(shí)現(xiàn)來體現(xiàn)。


在本章有個(gè)例子,是對上面代碼的改進(jìn),也可以稱作是在工廠中修改產(chǎn)品,但是本猿以為,例子似乎舉的不是很好,它把Html代碼嵌套在php代碼中,放在了產(chǎn)品類下的getProperties方法中,以供客戶調(diào)用的時(shí)候返回,所以我個(gè)人覺得這種方法不是很好,一大段代碼放在php中,也不方便編輯器編輯。設(shè)計(jì)模式是為了加快開發(fā)速度,這樣的方法我適得其反。作者是專家,可能也有出于其它考慮。不過里面有一個(gè)觀點(diǎn)我還是同意的,其中有一個(gè)輔助類的觀點(diǎn)。
所謂輔助類,就是把一些任務(wù)給一個(gè)多帶帶的對象來處理,而不是結(jié)合到某個(gè)參與者中。類似地,如果需要重用一組HTML標(biāo)記,可以把它們打包到另一個(gè)對象中以便重用。下面是一個(gè)例子

topper = "
               
        
        Map Factory
         ";
        return $this->topper;
    }
    public function closeUp(){
        $this->bottom = "";
        return $this->bottom;
    }
}
?>

增加新產(chǎn)品和參數(shù)化請求

上圖與之前的類圖不同,它們完成同樣的目標(biāo),不過它們的實(shí)現(xiàn)有所不同。這就是參數(shù)化工廠方法設(shè)計(jì)模式(上圖)與一般的工廠方法設(shè)計(jì)模式(原類圖)的主要區(qū)別之一,即客戶包含工廠和產(chǎn)品的引用。在參數(shù)化請求中,Client類必須指定產(chǎn)品,而不只是產(chǎn)品工廠,factoryMethod()操作中的參數(shù)是由客戶傳入的一個(gè)產(chǎn)品,所以客戶必須指出它想要的具體產(chǎn)品,不過,這個(gè)請求仍然通過Creator接口發(fā)出,所以,盡管客戶包含一個(gè)產(chǎn)品引用,但通過Creator,客戶仍與產(chǎn)品分離

一個(gè)工廠多個(gè)產(chǎn)品

對于大多數(shù)請求,參數(shù)化工廠方法更為簡單,因?yàn)榭蛻糁恍枰幚硪粋€(gè)具體工廠,工廠方法操作有一個(gè)參數(shù),指示需要?jiǎng)?chuàng)建的產(chǎn)品。而在原來的設(shè)計(jì)中,每個(gè)產(chǎn)品都有自己的工廠,不需要另外傳遞參數(shù),產(chǎn)品實(shí)現(xiàn)依賴于各個(gè)產(chǎn)品的特定工廠。

要從參數(shù)化工廠方法設(shè)計(jì)模式實(shí)現(xiàn)多個(gè)產(chǎn)品,只需使用Product接口實(shí)現(xiàn)多個(gè)具體產(chǎn)品,另外,由于具體產(chǎn)品要同時(shí)包含文本和圖像,所以在這個(gè)例子中,并不是分別有這兩個(gè)多帶帶的產(chǎn)品,可以建立一個(gè)類,將文本和圖像作為一個(gè)同意的實(shí)體來處理,這并不違反單一職責(zé)原則,即每個(gè)類應(yīng)當(dāng)只有一個(gè)職責(zé)。對于這個(gè)類來說,這個(gè)單一職責(zé)就是顯示描述一個(gè)區(qū)域的文本和圖像

新工廠

新工廠與原來的工廠類似,不過它們還包含一個(gè)參數(shù)和代碼提示。

factoryMethod($countryProduct);
        return $mfg;
    }
}
?>

新的Creator抽象類中可以看到,factoryMethod()和startFactory操作都需要一個(gè)參數(shù)。另外代碼提示只是了一個(gè)Product對象,而不是Prodcut一個(gè)特定實(shí)現(xiàn),所以可以接受Product的任何具體實(shí)例,下面來看看具體的創(chuàng)建者CountryFactory

country = $product;
        return ($this->country->getProperties());
    }
}
?>

這個(gè)具體創(chuàng)建者包含一個(gè)私有變量$country,其中包含客戶請求的特定產(chǎn)品,它再使用Product方法getProperties()將產(chǎn)品返回給客戶

與試圖讓任意數(shù)目的類和對象都保持不變相比,保持接口不變要容易得多。正是因?yàn)檫@個(gè)原因,使用工廠方法模式可以簡化復(fù)雜的創(chuàng)建過程,關(guān)鍵就在于它在維持一個(gè)公共接口。

本文參考書籍:《Learnig PHP設(shè)計(jì)模式》第2部分第5章

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21240.html

相關(guān)文章

  • Chap3創(chuàng)建設(shè)計(jì)模式————工廠方法設(shè)計(jì)模式(下)

    摘要:上章講的是創(chuàng)建型的設(shè)計(jì)模式,工廠方法上,這次要講的是另一本書關(guān)于工廠方法的一些概念以及案例模型等等。工廠方法模式假設(shè)你有一個(gè)關(guān)于個(gè)人事務(wù)管理的項(xiàng)目,功能之一是管理預(yù)約對象。 上章講的是創(chuàng)建型的設(shè)計(jì)模式,工廠方法(上),這次要講的是另一本書關(guān)于工廠方法的一些概念以及案例、模型等等。就像電影風(fēng)雨哈佛路中那個(gè)老師提問,為什么要用另外的一張一張紙質(zhì)資料,而不直接用書籍。女主回答說,因?yàn)椴煌馁Y...

    ephererid 評論0 收藏0
  • Learning PHP —— 設(shè)計(jì)模式 | Chap2:設(shè)計(jì)模式與UML

    摘要:設(shè)計(jì)模式設(shè)計(jì)模式基本原則設(shè)計(jì)原則按接口而不是按實(shí)現(xiàn)來編程按接口而不是按實(shí)現(xiàn)編程是指,要將變量設(shè)置為一個(gè)抽象類或接口數(shù)據(jù)類型的實(shí)例,而不是一個(gè)具體實(shí)現(xiàn)的實(shí)例。例如父類的一個(gè)改變會逐級向下傳遞給子類實(shí)現(xiàn),這可能會影響子類使用的某個(gè)算法。 設(shè)計(jì)模式 設(shè)計(jì)模式基本原則 設(shè)計(jì)原則 ① : 按接口而不是按實(shí)現(xiàn)來編程 按接口而不是按實(shí)現(xiàn)編程是指,要將變量設(shè)置為一個(gè)抽象類或接口數(shù)據(jù)類型的實(shí)例,而不是一...

    senntyou 評論0 收藏0
  • PHP 設(shè)計(jì)模式概述

    摘要:創(chuàng)建型模式主要有以下五種簡單工廠模式和工廠方法模式抽象工廠模式單例模式建造者模式原型模式在設(shè)計(jì)模式一書中將工廠模式分為兩類工廠方法模式與抽象工廠模式。 一、 設(shè)計(jì)模式(Design pattern)是什么 設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉、經(jīng)過分類編目的代碼設(shè)計(jì)的經(jīng)驗(yàn)總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 二、 為什么會有設(shè)計(jì)模式 在軟件開發(fā)過...

    IntMain 評論0 收藏0
  • 設(shè)計(jì)模式--簡化解釋(一)——創(chuàng)建設(shè)計(jì)模式

    摘要:維基百科在軟件工程中,創(chuàng)建型設(shè)計(jì)模式是用于解決對象創(chuàng)建機(jī)制,嘗試在指定場景下使用合理的方式來創(chuàng)建對象的設(shè)計(jì)模式。維基百科說建造者模式是一種對象創(chuàng)建軟件設(shè)計(jì)模式,其目的是找到一種解決方案,以解決可伸縮構(gòu)造函數(shù)的反模式。 1.創(chuàng)建型設(shè)計(jì)模式2.結(jié)構(gòu)型設(shè)計(jì)模式3.行為型設(shè)計(jì)模式 創(chuàng)建型設(shè)計(jì)模式 簡而言之 創(chuàng)建型設(shè)計(jì)模式關(guān)注的是如何實(shí)例化一個(gè)或者一組相關(guān)的對象。 維基百科 在軟件工程中,創(chuàng)建型...

    iKcamp 評論0 收藏0
  • JavaScript設(shè)計(jì)模式第一彈-創(chuàng)建設(shè)計(jì)模式

    摘要:前言接下來將會為大家介紹設(shè)計(jì)模式中的創(chuàng)建型設(shè)計(jì)模式,在此之前需要掌握一定的對象繼承基礎(chǔ)。但是如果是工廠方法模式的話,則只需要往工廠方法中添加基類則可以。 前言 接下來將會為大家介紹設(shè)計(jì)模式中的創(chuàng)建型設(shè)計(jì)模式,在此之前需要掌握一定的JavaScript對象繼承基礎(chǔ)。 簡單工廠模式 先說說 什么是簡單工廠模式:又叫靜態(tài)工廠方法,由一個(gè)工廠對象決定創(chuàng)建某一種產(chǎn)品對象類的實(shí)例 看著定義有點(diǎn)懵,...

    陳江龍 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<