搜尋
首頁後端開發php教程聊聊PHP中的抽象工廠模式

本篇文章帶大家來了解PHP設計模式中的抽象工廠模式。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

聊聊PHP中的抽象工廠模式

工廠模式系列中的重頭戲來了,沒錯,那正是傳聞中的抽象工廠模式。初次聽到這個名字的時候有什麼感覺?反正我是感覺這貨應該是非常高大上的,畢竟包含著「抽象」兩個字。話說這兩個字在開發中真的是有點高大上的感覺,一帶上抽象兩字就好像哪哪都很厲害了呢。不過,抽象工廠也確實可以說是工廠模式的大哥大。

Gof類別圖及解釋

其實只要了解工廠方法模式,就很容易明白抽象工廠模式。怎麼說呢?還是一樣的延遲到子類,還是一樣的回傳指定的物件。只是抽象工廠裡面不只回傳一個對象,而是回傳一堆。

GoF定義:提供一個建立一系列相關或相互依賴物件的接口,而無需指定它們特定的類別。

GoF類別圖:

聊聊PHP中的抽象工廠模式

  • #左邊是兩個工廠1和2,都繼承一個抽象工廠,都實作了CreateProductA和CreateProductB方法
  • 工廠1生產的是ProductA1和ProductB1
  • 同樣的,工廠2生產的是ProductA2和ProductB2

程式碼實現

// 商品A抽象接口
interface AbstractProductA
{
    public function show(): void;
}

// 商品A1实现
class ProductA1 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA1 is Show!' . PHP_EOL;
    }
}
// 商品A2实现
class ProductA2 implements AbstractProductA
{
    public function show(): void
    {
        echo 'ProductA2 is Show!' . PHP_EOL;
    }
}

// 商品B抽象接口
interface AbstractProductB
{
    public function show(): void;
}
// 商品B1实现
class ProductB1 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB1 is Show!' . PHP_EOL;
    }
}
// 商品B2实现
class ProductB2 implements AbstractProductB
{
    public function show(): void
    {
        echo 'ProductB2 is Show!' . PHP_EOL;
    }
}

商品的實現,東西很多吧,這回其實是有四件商品了分別是A1、A2、B1和B2,他們之間假設有這樣的關係,A1和B1是同類相關的商品,B1和B2是同類相關的商品

// 抽象工厂接口
interface AbstractFactory
{
    // 创建商品A
    public function CreateProductA(): AbstractProductA;
    // 创建商品B
    public function CreateProductB(): AbstractProductB;
}

// 工厂1,实现商品A1和商品B1
class ConcreteFactory1 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA1();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB1();
    }
}

// 工厂2,实现商品A2和商品B2
class ConcreteFactory2 implements AbstractFactory
{
    public function CreateProductA(): AbstractProductA
    {
        return new ProductA2();
    }
    public function CreateProductB(): AbstractProductB
    {
        return new ProductB2();
    }
}

而我們的工廠也是工廠1和工廠2,工廠1生產的是A1和B1這兩種相關聯的產品,工廠2生產的是A2和B2這兩種商品。好吧,我知道這裡還是有點抽象,可能還是搞不懂為什麼要這樣,我們繼續以手機生產來舉例。

我們的手機品牌起來了,所以周邊如手機膜、手機殼也交給了富X康(AbstractFactory)來幫我搞定。上回說到,我已經有幾款不同類型的手機了,於是還是照原來那樣,衡陽工廠(Factory1)生產型號1001的手機(ProductA1),同時型號1001手機的手機膜(ProductB1)和手機殼( ProductC1)也是衡陽工廠生產出來。而型號1002的手機(ProductA2)還是在鄭州工廠(Factory2),這個型號的手機膜(ProductB2)和手機膜(ProductC2)也就交給他們來搞定吧。於是,我還是只去跟總廠下單,他們讓不同的工廠給我生產了一整套的手機產品,可以直接賣套裝咯! !

完整程式碼:抽象工廠模式

https://github.com/zhangyue0503/designpatterns-php/blob/master/03.abstract-factory/source/ abstract-factory.php

實例

#是看得還是有點暈。其實說簡單點,真的就是在一個工廠類別中透過不同的方法返回不同的物件而已。讓我們再用發送簡訊的實例來講解吧!

場景:這次我們有個業務需求是,不僅要發短信,還要同時發一條推送。簡訊的目的是通知用戶有新的活動參加,而推播不僅通知有新的活動,直接點擊就可以進去領紅包了,是不是很興奮。還好之前我們的選擇的雲端服務供應商都是即有簡訊也有推送介面的,所以我們就直接用抽象工廠來實現吧!

簡訊傳送類別圖

聊聊PHP中的抽象工廠模式

<?php

interface Message {
    public function send(string $msg);
}

class AliYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;阿里云短信(原阿里大鱼)发送成功!短信内容:&#39; . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;百度SMS短信发送成功!短信内容:&#39; . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;极光短信发送成功!短信内容:&#39; . $msg;
    }
}

interface Push {
    public function send(string $msg);
}

class AliYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;阿里云Android&iOS推送发送成功!推送内容:&#39; . $msg;
    }
}

class BaiduYunPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;百度Android&iOS云推送发送成功!推送内容:&#39; . $msg;
    }
}

class JiguangPush implements Push{
    public function send(string $msg){
        // 调用接口,发送客户端推送
        // xxxxx
        return &#39;极光推送发送成功!推送内容:&#39; . $msg;
    }
}


interface MessageFactory{
    public function createMessage();
    public function createPush();
}

class AliYunFactory implements MessageFactory{
    public function createMessage(){
        return new AliYunMessage();
    }
    public function createPush(){
        return new AliYunPush();
    }
}

class BaiduYunFactory implements MessageFactory{
    public function createMessage(){
        return new BaiduYunMessage();
    }
    public function createPush(){
        return new BaiduYunPush();
    }
}

class JiguangFactory implements MessageFactory{
    public function createMessage(){
        return new JiguangMessage();
    }
    public function createPush(){
        return new JiguangPush();
    }
}

// 当前业务需要使用阿里云
$factory = new AliYunFactory();
// $factory = new BaiduYunFactory();
// $factory = new JiguangFactory();
$message = $factory->createMessage();
$push = $factory->createPush();
echo $message->send(&#39;您已经很久没有登录过系统了,记得回来哦!&#39;);
echo $push->send(&#39;您有新的红包已到帐,请查收!&#39;);

完整原始碼:簡訊傳送工廠方法

https: //github.com/zhangyue0503/designpatterns-php/blob/master/03.abstract-factory/source/abstract-factory-message-push.php

說明

################################################## ########是不是很清晰了? ######沒錯,我們有兩個產品,一個是Message,一個是Push,分別是發送訊息和發推送######抽象工廠只是要求我們的介面實現者必須去實現兩個方法,回傳簡訊和發推的物件######你說我只想傳簡訊不想發推文可以嗎?當然可以啦,不去呼叫createPush()方法不就行了######抽象工廠最適合什麼場景?很明顯,一系列相關物件的創建######工廠方法模式是抽象工廠的核心,相當於多個工廠方法被放到一個大工廠中生產一整套產品(包含週邊)而不是一件單獨的產品#########推薦學習:《###PHP影片教學###》###

以上是聊聊PHP中的抽象工廠模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

您應該多久再生一次會話ID?您應該多久再生一次會話ID?Apr 23, 2025 am 12:03 AM

會話ID應在登錄時、敏感操作前和每30分鐘定期重新生成。 1.登錄時重新生成會話ID可防會話固定攻擊。 2.敏感操作前重新生成提高安全性。 3.定期重新生成降低長期利用風險,但需權衡用戶體驗。

如何在PHP中設置會話cookie參數?如何在PHP中設置會話cookie參數?Apr 22, 2025 pm 05:33 PM

在PHP中設置會話cookie參數可以通過session_set_cookie_params()函數實現。 1)使用該函數設置參數,如過期時間、路徑、域名、安全標誌等;2)調用session_start()使參數生效;3)根據需求動態調整參數,如用戶登錄狀態;4)注意設置secure和httponly標誌以提升安全性。

在PHP中使用會議的主要目的是什麼?在PHP中使用會議的主要目的是什麼?Apr 22, 2025 pm 05:25 PM

在PHP中使用會話的主要目的是維護用戶在不同頁面之間的狀態。 1)會話通過session_start()函數啟動,創建唯一會話ID並存儲在用戶cookie中。 2)會話數據保存在服務器上,允許在不同請求間傳遞數據,如登錄狀態和購物車內容。

您如何在子域中分享會議?您如何在子域中分享會議?Apr 22, 2025 pm 05:21 PM

如何在子域名間共享會話?通過設置通用域名的會話cookie實現。 1.在服務器端設置會話cookie的域為.example.com。 2.選擇合適的會話存儲方式,如內存、數據庫或分佈式緩存。 3.通過cookie傳遞會話ID,服務器根據ID檢索和更新會話數據。

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

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

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版