一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - PHP設(shè)計模式(三)建造者模式Builder實例詳解【創(chuàng)建型】

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

2020-06-28 14:04規(guī)速 PHP教程

這篇文章主要介紹了PHP設(shè)計模式:建造者模式Builder,結(jié)合實例形式詳解分析了PHP建造者模式Builder相關(guān)概念、功能、原理、實現(xiàn)技巧與相關(guān)操作注意事項,需要的朋友可以參考下

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

1. 概述

 

       在軟件開發(fā)的過程中,當(dāng)遇到一個“復(fù)雜的對象”的創(chuàng)建工作,該對象由一定各個部分的子對象用一定的算法構(gòu)成,由于需求的變化,復(fù)雜對象的各個部分經(jīng)常面臨劇烈的變化,但將它們組合在一起的算法相對穩(wěn)定。

       例子1:買肯德基

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

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

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

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

2 . 問題

 

我們?nèi)绾螒?yīng)對這種變化,如何提供一種“封裝機制”來隔離“復(fù)雜對象的各個部”的變化,從而保持系統(tǒng)中的“穩(wěn)定構(gòu)建算法”而不隨需求的變化而變化?

3. 解決方案

 

建造者模式: 將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

4. 適用性

 

在以下情況使用Builder模式

•當(dāng)創(chuàng)建復(fù)雜對象的算法應(yīng)該獨立于該對象的組成部分以及它們的裝配方式時。

•當(dāng)構(gòu)造過程必須允許被構(gòu)造的對象有不同的表示時。

5. 結(jié) 構(gòu)

 

此模式結(jié)構(gòu)如下頁上圖所示。

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

6. 構(gòu)建模式的組成

 

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

• 具體建造者(ConcreteBuilder)

1)實現(xiàn)Builder的接口以構(gòu)造和裝配該產(chǎn)品的各個部件。即實現(xiàn)抽象建造者角色Builder的方法。

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

3)  提供一個檢索產(chǎn)品的接口

4)   構(gòu)造一個使用Builder接口的對象即在指導(dǎo)者的調(diào)用下創(chuàng)建產(chǎn)品實例

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

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

7. 效果

 

Builder模式的主要效果:

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

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

3 ) 它使你可對構(gòu)造過程進行更精細(xì)的控制 Builder模式與一下子就生成產(chǎn)品的創(chuàng)建型模式不同,它是在導(dǎo)向者的控制下一步一步構(gòu)造產(chǎn)品的。僅當(dāng)該產(chǎn)品完成時導(dǎo)向者才從生成器中取回它。因此Builder接口相比其他創(chuàng)建型模式能更好的反映產(chǎn)品的構(gòu)造過程。這使你可以更精細(xì)的控制構(gòu)建過程,從而能更精細(xì)的控制所得產(chǎn)品的內(nèi)部結(jié)構(gòu)。

8. 實現(xiàn):

 

指導(dǎo)者:收銀員

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
 /**
 * 指導(dǎo)者:收銀員
 *
 */
 class DirectorCashier
 {
 /**
  * 收銀餐館員工返回的食物
  *
  */
 public function buildFood(Builder $builder) {
  $builder->buildPart1();
  $builder->buildPart2();
 }
 }

抽象建造者:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 抽象建造者
*
*/
abstract class Builder
{
/**
 * 創(chuàng)建產(chǎn)品的第一部分
  */
public abstract function buildPart1();
 
/**
 *
 * 創(chuàng)建產(chǎn)品的第二部分
  */
public abstract function buildPart2();
 
/**
 *
 * 返回產(chǎn)品
  */
public abstract function getProduct();
}

具體建造者類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
 * 具體建造者類:餐館員工,返回的套餐是:漢堡兩個+飲料一個
 *
 */
 class ConcreteBuilder1 extends Builder
 {
 protected $_product = null;//產(chǎn)品對象
 function __construct(){
  $this->_product = new Product();
 }
 
 /**
  * 創(chuàng)建產(chǎn)品的第一部分::漢堡=2
   */
 public function buildPart1()
 {
  $this->_product->add('Hamburger',2);
 }
 /**
  *
  * 創(chuàng)建產(chǎn)品的第二部分:
   */
 public function buildPart2()
 {
  $this->_product->add('Drink', 1);
 }
 /**
  * 返回產(chǎn)品對象 :
  *
  */
 public function getProduct() {
  return $this->_product;
 }
 }
/**
 * 具體建造者類:餐館員工,漢堡1個+飲料2個
 *
 */
 class ConcreteBuilder2 extends Builder
 {
 protected $_product = null;//產(chǎn)品對象
 function __construct(){
  $this->_product = new Product();
 }
 
 /**
  * 創(chuàng)建產(chǎn)品的第一部分:漢堡
   */
 public function buildPart1()
 {
  $this->_product->add('Hamburger', 1);
 }
 /**
  *
  * 創(chuàng)建產(chǎn)品的第二部分:drink=2
   */
 public function buildPart2()
 {
  $this->_product->add('Drink', 2);
 }
 /**
  * 返回產(chǎn)品對象 :
  *
  */
 public function getProduct() {
  return $this->_product;
 }
 }

產(chǎn)品類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**
 * 產(chǎn)品類
 */
 class Product
 {
 public $products = array();
 /**
  * 添加具體產(chǎn)品
  */
 public function add($name, $value) {
  $this->products[$name] = $value;
 }
 /**
  * 給顧客查看產(chǎn)品
  */
 public function showToClient()
 {
  foreach ($this->products as $key => $v) {
  echo $key , '=' , $v ,'<br>';
  }
 }
 }

客戶程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//客戶程序
class Client
{
/**
 * 顧客購買套餐
 *
 */
public function buy($type) {
 //指導(dǎo)者,收銀員
 $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);//購買套餐1

9. 建造者模式的優(yōu)點

 

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

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

10. 建造者模式與工廠模式的區(qū)別

 

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

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

11. 總結(jié)

 

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

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

原文鏈接:https://blog.csdn.net/hguisu/article/details/7518060

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天海翼黄色三级 | 爱爱亚洲 | 欧美特级午夜一区二区三区 | 国产成人久久久精品一区二区三区 | 女人张开腿让男人做爽爽 | 四虎影院的网址 | 我将她侵犯1~6樱花动漫在线看 | fuqer日本老师 | 丝瓜秋葵番茄绿巨人在线观看 | 校园纯肉H教室第一次 | 欧美三级不卡在线观线看高清 | 国产一级特黄aa大片免费 | 女教师雪白老汉 | 国产高清不卡视频在线播放 | 久久午夜一区二区 | 国内精品中文字幕 | 国产日韩欧美精品在线 | 大陆日韩欧美 | 精品视频网站 | a级毛片毛片免费很很综合 a级黄色视屏 | 秋霞黄色片 | 欧美又黄又激烈真实床戏 | 国产三级精品久久三级国专区 | 日本在线国产 | 精品久久综合一区二区 | 久久亚洲一级α片 | 女人肮脏的交易中文字幕未删减版 | 四虎免费在线观看 | 羞羞答答免费人成黄页在线观看国产 | 欧美精品国产第一区二区 | 久久受www免费人成_看片中文 | 亚洲天堂网2018 | 精品第一国产综合精品蜜芽 | 果冻传媒91 | 我的奶头被客人吸的又肿又红 | 久久综合给会久久狠狠狠 | 无码国产成人777爽死在线观看 | 嗯好爽视频 | 成 人 免费 小说在线观看 | 香蕉免费一区二区三区 | 国产好痛疼轻点好爽的视频 |