搜尋
首頁後端開發php教程詳解PHP設計模式之建造者模式

詳解PHP設計模式之建造者模式

Jan 05, 2018 pm 05:51 PM
php設計模式

本文主要介紹了php設計模式中的建造者模式,使用php實現建造者模式,有興趣的小夥伴可以參考一下。希望對大家有幫助。

建造者模式可以讓一個產品的內部表象和和產品的生產過程分離開,從而可以產生具有不同內部表象的產品。
一、Builder模式結構圖

 

二、Builder模式中主要角色
抽象建造者(Builder)角色:定義一個抽象接口,規範產品各個組成成分的建造(即規範具體建造者的方法實現)。其中所規範的方法中必須包括建造方法和結果返回方法
具體建造者(ConcreteBuilder)角色:實作抽象建造者角色所定義的方法。具體建造者與業務邏輯關聯性較大,應用程式最終會透過呼叫此角色中所實現的建造方法按照業務邏輯建立產品,在建造完成後透過結果返回方法傳回建造的產品實例。一般在外部由客戶或一個抽象工廠創建。
導演者(Director)角色:此角色的作用是呼叫特定的建造者角色來建造產品。導演者與產品類別沒有直接關係,與產品類別交談的是具體抽象角色。
產品(Product)角色:在指導者的指導下由建造者所創建的那個複雜的物件
導演者角色與客戶端直接打交道,它理解客戶端的業務邏輯,將客戶端建立產品的請求拆分成對產品組成部分的請求,然後呼叫特定產品角色執行建造操作。它分離了客戶端與具體建造者。
三、Builder模式的優缺點
Builder模式的優點: 建造者模式可以很好的將一個物件的實現與相關的「業務」邏輯分離開來,從而可以在不改變事件邏輯的前提下,使增加(或改變)實現變得非常容易。
Builder模式的缺點: 建造者介面的修改會導致所有執行類別的修改。
四、Builder模式的使用場景與效果
以下情況應使用建造者模式:
1、 需要產生的產品物件有複雜的內部結構。
2、 需要產生的產品物件的屬性相互依賴,建造者模式可以強迫生成順序。
3、 在對象創建過程中會使用到系統中的一些其它對象,這些對像在產品對象的創建過程中不易得到。
使用建造者模式主要有以下效果:
1、 建造者模式的使用使得產品的內部表象可以獨立的變化。使用建造者模式可以使客戶端不必知道產品內部組成的細節。
2、 每一個Builder相對獨立,而與其它的Builder無關。
3、 模式所建造的最終產品更容易控制。
五、Builder模式與其它模式
抽象工廠模式(abstract factory模式):在抽象工廠模式中,每一次工廠對象被呼叫時都會返還一個完整的產品對象,而客戶端可能會將這些產品組裝成一個更大更複雜的產品,也可能不會。建造者模式則不同,它一點一點地建造出一個複雜的產品,而這個產品的組裝過程發生在建造者內部。二者的差別在於是否有組裝過程,組裝過程發生的位置。這兩個設計模式可以連起來用,客戶端透過呼叫一個建造角色,間接地呼叫另一個抽象工廠模式的工廠角色。工廠模式返還不同產品族的零件,而建造者模式則把它們組裝起來。

策略模式(strategy模式):建造者模式在結構上很接近策略模式,事實上建造者模式是策略模式的一種特殊情況。二者的差別在於用意不同。建造者模式作用於客戶端一點一點的建造新的對象,而策略模式的目的是為演算法提供抽象的介面。

建造者模式與模板方法模式:建造者模式在退化、失去導演者角色後,可以發展到模板方法模式(即將建造過程的演算法實現放在建造角色中)。

建造者模式與合成模式:合成模式描述一個物件樹的組成結構,而建造者模式則可以用來描述物件樹的生成過程。
以上4點來自《Java與模式》
六、Builder模式PHP範例

#
<?php
/**
 * 产品
 * 此处仅以一个产品类中的字符串演示产品
 */
class Product {                          
 /**
 * 产品的组成部分集合
 */
 private $_parts;
 
 public function __construct() {
 $this->_parts = array();
 }
 
 public function add($part) {
 return array_push($this->_parts, $part);
 }
 
 public function show() {
 echo "the product include:";
 array_map(&#39;printf&#39;, $this->_parts);
 }
}
 
/**
 * 抽象建造者 
 */
abstract class Builder {
 
 /**
 * 产品零件构造方法1
 */
 public abstract function buildPart1();
 
 
 /**
 * 产品零件构造方法2
 */
 public abstract function buildPart2();
 
 
 /**
 * 产品返还方法
 */
 public abstract function getResult();
}
 
/**
 * 具体建造者
 */
class ConcreteBuilder extends Builder {
 
 private $_product;
 
 public function __construct() {
 $this->_product = new Product();
 }
 
 public function buildPart1() {
 $this->_product->add("Part1");
 }
 
 public function buildPart2() {
 $this->_product->add("Part2");
 }
 
 public function getResult() {
 return $this->_product;
 }
}
 
/**
 * 导演者
 */
class Director {
 
 public function __construct(Builder $builder) {
 $builder->buildPart1();
 $builder->buildPart2();
 }
}
 
 
 
class Client {
 
 /**
 * Main program.
 */
 public static function main() {
 $buidler = new ConcreteBuilder();
 $director = new Director($buidler);
 $product = $buidler->getResult();
 $product->show();
 }
 
}
 
Client::main();
?>

相關推薦:

##php設計模式之適配器模式詳解#

PHP設計模式之迭代器模式詳解

#PHP設計模式之裝飾器模式詳解

以上是詳解PHP設計模式之建造者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何檢查PHP會話是否已經開始?如何檢查PHP會話是否已經開始?Apr 30, 2025 am 12:20 AM

在PHP中,可以使用session_status()或session_id()來檢查會話是否已啟動。 1)使用session_status()函數,如果返回PHP_SESSION_ACTIVE,則會話已啟動。 2)使用session_id()函數,如果返回非空字符串,則會話已啟動。這兩種方法都能有效地檢查會話狀態,選擇使用哪種方法取決於PHP版本和個人偏好。

描述一個場景,其中使用會話在Web應用程序中至關重要。描述一個場景,其中使用會話在Web應用程序中至關重要。Apr 30, 2025 am 12:16 AM

sessionsarevitalinwebapplications,尤其是在commercePlatform之前。

如何管理PHP中的並發會話訪問?如何管理PHP中的並發會話訪問?Apr 30, 2025 am 12:11 AM

在PHP中管理並發會話訪問可以通過以下方法:1.使用數據庫存儲會話數據,2.採用Redis或Memcached,3.實施會話鎖定策略。這些方法有助於確保數據一致性和提高並發性能。

使用PHP會話的局限性是什麼?使用PHP會話的局限性是什麼?Apr 30, 2025 am 12:04 AM

PHPsessionshaveseverallimitations:1)Storageconstraintscanleadtoperformanceissues;2)Securityvulnerabilitieslikesessionfixationattacksexist;3)Scalabilityischallengingduetoserver-specificstorage;4)Sessionexpirationmanagementcanbeproblematic;5)Datapersis

解釋負載平衡如何影響會話管理以及如何解決。解釋負載平衡如何影響會話管理以及如何解決。Apr 29, 2025 am 12:42 AM

負載均衡會影響會話管理,但可以通過會話複製、會話粘性和集中式會話存儲解決。 1.會話複製在服務器間複製會話數據。 2.會話粘性將用戶請求定向到同一服務器。 3.集中式會話存儲使用獨立服務器如Redis存儲會話數據,確保數據共享。

說明會話鎖定的概念。說明會話鎖定的概念。Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

有其他PHP會議的選擇嗎?有其他PHP會議的選擇嗎?Apr 29, 2025 am 12:36 AM

PHP會話的替代方案包括Cookies、Token-basedAuthentication、Database-basedSessions和Redis/Memcached。 1.Cookies通過在客戶端存儲數據來管理會話,簡單但安全性低。 2.Token-basedAuthentication使用令牌驗證用戶,安全性高但需額外邏輯。 3.Database-basedSessions將數據存儲在數據庫中,擴展性好但可能影響性能。 4.Redis/Memcached使用分佈式緩存提高性能和擴展性,但需額外配

在PHP的上下文中定義'會話劫持”一詞。在PHP的上下文中定義'會話劫持”一詞。Apr 29, 2025 am 12:33 AM

Sessionhijacking是指攻擊者通過獲取用戶的sessionID來冒充用戶。防範方法包括:1)使用HTTPS加密通信;2)驗證sessionID的來源;3)使用安全的sessionID生成算法;4)定期更新sessionID。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境