日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP設計模式(三)建造者模式Builder實例詳解【創建型】

瀏覽:239日期:2022-09-10 15:10:18

本文實例講述了PHP設計模式:建造者模式Builder。分享給大家供大家參考,具體如下:

1. 概述

在軟件開發的過程中,當遇到一個“復雜的對象”的創建工作,該對象由一定各個部分的子對象用一定的算法構成,由于需求的變化,復雜對象的各個部分經常面臨劇烈的變化,但將它們組合在一起的算法相對穩定。

例子1:買肯德基

典型的兒童餐包括一個主食,一個輔食,一杯飲料和一個玩具(例如漢堡、炸雞、可樂和玩具車)。這些在不同的兒童餐中可以是不同的,但是組合成兒童餐的過程是相同的。

PHP設計模式(三)建造者模式Builder實例詳解【創建型】

客戶端:顧客,想去買一套套餐(這里面包括漢堡,可樂,薯條),可以有1號和2號兩種套餐供顧客選擇。 指導者角色:收銀員。知道顧客想要買什么樣的套餐,并告訴餐館員工去準備套餐。 建造者角色:餐館員工。按照收銀員的要求去準備具體的套餐,分別放入漢堡,可樂,薯條等。 產品角色:最后的套餐,所有的東西放在同一個盤子里面。

例子2:計算工資:工資的計算一般是:底薪+獎金-稅。但底薪分為一級8000、二級6000、三級4000三個等級。根據崗位不同獎金的發放也不一樣,管理及日常事務處理崗位(A類)每月根據領導及同事間的評議得分計算獎金,銷售崗位(B類)則根據銷售額發放提成。稅金則根據獎金和底薪的數額進行計算。由此看出該工資的計算方式是比較穩定的構建算法,但對工資的每一部分都會根據不同的情況產生不同的算法,如何將客戶端與變化巨烈的底薪、獎金和稅金計算方式分離呢,這也比較適合用建造者模式。

2 . 問題

我們如何應對這種變化,如何提供一種“封裝機制”來隔離“復雜對象的各個部”的變化,從而保持系統中的“穩定構建算法”而不隨需求的變化而變化?

3. 解決方案

建造者模式: 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

4. 適用性

在以下情況使用Builder模式

•當創建復雜對象的算法應該獨立于該對象的組成部分以及它們的裝配方式時。

•當構造過程必須允許被構造的對象有不同的表示時。

5. 結 構

此模式結構如下頁上圖所示。

PHP設計模式(三)建造者模式Builder實例詳解【創建型】

6. 構建模式的組成

• 抽象建造者角色(Builder):為創建一個Product對象的各個部件指定抽象接口,以規范產品對象的各個組成成分的建造。一般而言,此角色規定要實現復雜對象的哪些部分的創建,并不涉及具體的對象部件的創建。

• 具體建造者(ConcreteBuilder)

1)實現Builder的接口以構造和裝配該產品的各個部件。即實現抽象建造者角色Builder的方法。

2)定義并明確它所創建的表示,即針對不同的商業邏輯,具體化復雜對象的各部分的創建

3) 提供一個檢索產品的接口

4) 構造一個使用Builder接口的對象即在指導者的調用下創建產品實例

指導者(Director):調用具體建造者角色以創建產品對象的各個部分。指導者并沒有涉及具體產品類的信息,真正擁有具體產品的信息是具體建造者對象。它只負責保證對象各部分完整創建或按某種順序創建。

產品角色(Product):建造中的復雜對象。它要包含那些定義組件的類,包括將這些組件裝配成產品的接口。

7. 效果

Builder模式的主要效果:

1 ) 它使你可以改變一個產品的內部表示 Builder對象提供給導向器一個構造產品的抽象接口。該接口使得生成器可以隱藏這個產品的表示和內部結構。它同時也隱藏了該產品是如何裝配的。因為產品是通過抽象接口構造的,你在改變該產品的內部表示時所要做的只是定義一個新的生成器。

2) 它將構造代碼和表示代碼分開 Builder模式通過封裝一個復雜對象的創建和表示方式提高了對象的模塊性。客戶不需要知道定義產品內部結構的類的所有信息;這些類是不出現在Builder接口中的。每個Concrete Builder包含了創建和裝配一個特定產品的所有代碼。這些代碼只需要寫一次;然后不同的Director可以復用它以在相同部件集合的基礎上構作不同的Product。

3 ) 它使你可對構造過程進行更精細的控制 Builder模式與一下子就生成產品的創建型模式不同,它是在導向者的控制下一步一步構造產品的。僅當該產品完成時導向者才從生成器中取回它。因此Builder接口相比其他創建型模式能更好的反映產品的構造過程。這使你可以更精細的控制構建過程,從而能更精細的控制所得產品的內部結構。

8. 實現:

指導者:收銀員

<?php /** * 指導者:收銀員 * */ class DirectorCashier { /** * 收銀餐館員工返回的食物 * */ public function buildFood(Builder $builder) { $builder->buildPart1(); $builder->buildPart2(); } }

抽象建造者:

/** * 抽象建造者 * */ abstract class Builder { /** * 創建產品的第一部分 */ public abstract function buildPart1(); /** * * 創建產品的第二部分 */ public abstract function buildPart2(); /** * * 返回產品 */ public abstract function getProduct(); }

具體建造者類:

/** * 具體建造者類:餐館員工,返回的套餐是:漢堡兩個+飲料一個 * */ class ConcreteBuilder1 extends Builder { protected $_product = null;//產品對象 function __construct(){ $this->_product = new Product(); } /** * 創建產品的第一部分::漢堡=2 */ public function buildPart1() { $this->_product->add(’Hamburger’,2); } /** * * 創建產品的第二部分: */ public function buildPart2() { $this->_product->add(’Drink’, 1); } /** * 返回產品對象 : * */ public function getProduct() { return $this->_product; } }/** * 具體建造者類:餐館員工,漢堡1個+飲料2個 * */ class ConcreteBuilder2 extends Builder { protected $_product = null;//產品對象 function __construct(){ $this->_product = new Product(); } /** * 創建產品的第一部分:漢堡 */ public function buildPart1() { $this->_product->add(’Hamburger’, 1); } /** * * 創建產品的第二部分:drink=2 */ public function buildPart2() { $this->_product->add(’Drink’, 2); } /** * 返回產品對象 : * */ public function getProduct() { return $this->_product; } }

產品類:

/** * 產品類 */ class Product { public $products = array(); /** * 添加具體產品 */ public function add($name, $value) { $this->products[$name] = $value; } /** * 給顧客查看產品 */ public function showToClient() { foreach ($this->products as $key => $v) { echo $key , ’=’ , $v ,’<br>’; } } }

客戶程序:

//客戶程序 class Client { /** * 顧客購買套餐 * */ public function buy($type) { //指導者,收銀員 $director = new DirectorCashier(); //餐館員工,收銀員 $class = new ReflectionClass(’ConcreteBuilder’ .$type ); $concreteBuilder = $class->newInstanceArgs(); //收銀員組合員工返回的食物 $director->buildFood($concreteBuilder); //返回給顧客 $concreteBuilder->getProduct()->showToClient(); } } //測試 ini_set(’display_errors’, ’On’); $c = new Client(); $c->buy(1);//購買套餐1 $c->buy(2);//購買套餐19. 建造者模式的優點

首先,建造者模式的封裝性很好。使用建造者模式可以有效的封裝變化,在使用建造者模式的場景中,一般產品類和建造者類是比較穩定的,因此,將主要的業務邏輯封裝在導演類中對整體而言可以取得比較好的穩定性。

其次,建造者模式很容易進行擴展。如果有新的需求,通過實現一個新的建造者類就可以完成,基本上不用修改之前已經測試通過的代碼,因此也就不會對原有功能引入風險。

10. 建造者模式與工廠模式的區別

我們可以看到,建造者模式與工廠模式是極為相似的,總體上,建造者模式僅僅只比工廠模式多了一個“導演類”的角色。在建造者模式的類圖中,假如把這個導演類看做是最終調用的客戶端,那么圖中剩余的部分就可以看作是一個簡單的工廠模式了。

與工廠模式相比,建造者模式一般用來創建更為復雜的對象,因為對象的創建過程更為復雜,因此將對象的創建過程獨立出來組成一個新的類——導演類。也就是說,工廠模式是將對象的全部創建過程封裝在工廠類中,由工廠類向客戶端提供最終的產品;而建造者模式中,建造者類一般只提供產品類中各個組件的建造,而將具體建造過程交付給導演類。由導演類負責將各個組件按照特定的規則組建為產品,然后將組建好的產品交付給客戶端。

11. 總結

建造者模式與工廠模式類似,他們都是建造者模式,適用的場景也很相似。一般來說,如果產品的建造很復雜,那么請用工廠模式;如果產品的建造更復雜,那么請用建造者模式。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美中文一区二区| 亚洲欧美日韩国产| 99视频一区| 欧美福利一区| 黑丝一区二区三区| 久久一二三区| 亚洲精品成人一区| 日韩有码av| 国产调教精品| 国产精品成人3p一区二区三区| 国产精品永久| 亚洲天堂av影院| 99精品视频在线| 性色av一区二区怡红| 国产麻豆综合| 亚洲精品系列| 91精品尤物| 国产精品白丝一区二区三区| 中文字幕亚洲精品乱码| 美女精品网站| 国产一区91| 日本在线视频一区二区| 亚洲日韩中文字幕一区| 蜜臀久久99精品久久久画质超高清| 亚洲激情婷婷| 中文一区二区| 日韩中文字幕区一区有砖一区| 亚洲激情偷拍| 免费的成人av| 日韩专区一卡二卡| 日韩欧美四区| 国产亚洲高清在线观看| 国产精品xxx在线观看| 日日摸夜夜添夜夜添国产精品| 蜜桃久久精品一区二区| 亚洲激情精品| 色在线视频观看| 激情久久婷婷| 国产一区二区高清| 亚洲毛片在线| 国产精品一区二区99| 国产精东传媒成人av电影| 红杏一区二区三区| 91精品久久久久久久久久不卡| 韩国三级一区| 欧美日韩在线二区| 一区在线视频观看| 日韩中出av| 国产精品久久| 日韩欧美精品一区| 夜夜精品视频| 日韩av不卡一区二区| 蜜桃精品视频| 神马日本精品| 91精品成人| 2023国产精品久久久精品双| 91精品日本| 精品一区电影| 91精品xxx在线观看| 欧美成人国产| 亚洲三级毛片| 麻豆成人综合网| 一区二区小说| 日本特黄久久久高潮| 色婷婷色综合| 亚洲欧美日韩精品一区二区 | 一区二区三区国产在线| 欧美啪啪一区| 日韩成人三级| 首页亚洲欧美制服丝腿| 久久精品av麻豆的观看方式| 国产成人免费精品| 四虎成人av| 亚洲电影在线一区二区三区| 手机在线电影一区| 午夜视频一区二区在线观看| 久久亚州av| 伊人久久成人| 开心激情综合| 国产婷婷精品| 精品网站999| 最新亚洲一区| 国产精品视频一区视频二区| 成人免费电影网址| 日韩精品福利一区二区三区| 高清av不卡| 综合一区av| 精品视频免费| 亚洲专区欧美专区| 国产在线日韩精品| 在线免费观看亚洲| 国产精品伦理久久久久久| 国产亚洲综合精品| 精品国产亚洲日本| 水蜜桃久久夜色精品一区的特点 | 亚洲精品成a人ⅴ香蕉片| 精品99在线| 亚洲久久视频| 欧美日韩一二三四| 麻豆91精品91久久久的内涵| 一本一道久久a久久精品蜜桃| 国产精品久久久网站| 午夜一级久久| 亚洲成av在线| 国产精品极品国产中出| 日韩中文字幕91| 日韩免费av| 国产福利一区二区精品秒拍 | 日本美女一区| 国产精品久久久久久模特 | 亚洲成av在线| 国产精品久久久亚洲一区| 亚洲精华国产欧美| 国产+成+人+亚洲欧洲在线| 亚洲精品裸体| 亚洲精品成人| 一区二区三区四区日本视频| 国产精品综合色区在线观看| 亚洲精品国产精品粉嫩| 1024精品久久久久久久久| 欧美一区久久久| 国产精品久久久久久久久免费高清 | 国产在线视频欧美一区| 日本伊人午夜精品| 黑丝一区二区三区| 日韩黄色大片| 日本久久黄色| 麻豆国产精品视频| 日韩精品亚洲一区二区三区免费| 久久蜜桃精品| 91成人福利| 91超碰国产精品| 9999国产精品| 免费视频一区二区三区在线观看| 亚洲深深色噜噜狠狠爱网站| 久久精品高清| 久久精品国产网站| 免费在线亚洲欧美| 日韩av一区二区三区四区| 亚洲一区国产一区| 欧美成人精品| 999久久久免费精品国产| 国内精品伊人| 免费在线欧美黄色| 久久只有精品| 国产精品探花在线观看| 欧美日韩va| 国产精品一区三区在线观看| 久久国产日韩欧美精品| 久久国产精品色av免费看| 91亚洲精品视频在线观看| 日韩欧美在线精品| 日本va欧美va欧美va精品| 国产一级成人av| 国产精品三级| 国产一区丝袜| 日本精品不卡| 不卡一区2区| 国产精品v日韩精品v欧美精品网站 | 91大神在线观看线路一区| 亚洲人成亚洲精品| 日韩精品视频中文字幕| 日韩二区在线观看| 加勒比视频一区| 欧美羞羞视频| 亚洲少妇自拍| 国产日韩一区二区三免费高清 | 久久uomeier| 成人羞羞视频在线看网址| 在线一区视频观看| 不卡视频在线| 日韩亚洲精品在线观看| 牛牛精品成人免费视频| 欧美一级精品| 亚洲精品无播放器在线播放| 国产一区二区三区91| 亚洲高清久久| 国产精品久久久久久模特| 国产一区丝袜| 视频一区中文字幕国产| 欧美久久香蕉| 欧美精品资源| 99在线|亚洲一区二区| 欧美成人午夜| 欧美日韩一区二区三区四区在线观看 | 久久精品国产www456c0m| 欧美va天堂| 国产精品2023| 欧美亚洲激情| 97精品久久| 激情久久中文字幕| 91成人福利| 欧美在线资源| 日韩成人精品一区二区三区| 久久激情一区| 欧美日韩精品一区二区三区视频 | 日韩欧美中文字幕一区二区三区| 国产激情精品一区二区三区| 国产在线不卡| 69堂免费精品视频在线播放|