PHP設計模式—工廠模式之抽象工廠模式

来源:https://www.cnblogs.com/woods1815/archive/2020/03/29/12592020.html
-Advertisement-
Play Games

定義: 抽象工廠模式:提供一個創建一系列相關或相互依賴對象的介面,而無需指定他們的具體類。抽象工廠模式主要解決涉及到多個產品系列的問題。 代碼實例: 先回顧上一篇中工廠方法模式的例子,該示例以 BloggsCal 和 MegaCal 兩種格式管理編碼。如果增加更多的編碼格式,這種類結構會橫向增長,但 ...


 

定義:

抽象工廠模式:提供一個創建一系列相關或相互依賴對象的介面,而無需指定他們的具體類。抽象工廠模式主要解決涉及到多個產品系列的問題。

 

代碼實例:

先回顧上一篇中工廠方法模式的例子,該示例以 BloggsCal 和 MegaCal 兩種格式管理編碼。如果增加更多的編碼格式,這種類結構會橫向增長,但如何為不同類型的 PIM 對象加入編碼器,使類結構“縱向”增長呢?
這裡將會用到三個相似的類層次結構,分別是預約(Appt)、待辦事項(Ttd)以及聯繫人(Contact)。

1、創建Appt 抽象類

/**
 * Appt 抽象類
 * Class ApptEncoder
 */
abstract class ApptEncoder
{
    abstract public function encode();
}

2、創建Ttd 抽象類

/**
 * Ttd 抽象類
 * Class TtdEncoder
 */
abstract class TtdEncoder
{
    abstract public function encode();
}

3、創建Contact 抽象類

/**
 * Contact 抽象類
 * Class ContactEncoder
 */
abstract class ContactEncoder
{
    abstract public function encode();
}

4、創建BloggsCal Appt 格式處理類

/**
 * BloggsCal Appt 格式處理類
 * Class BloggsApptEncoder
 */
class BloggsApptEncoder extends ApptEncoder
{
    public function encode()
    {
        // TODO: Implement encode() method.
        return "Appointment data encoded in BloggsCal format\n";
    }
}

5、創建BloggsCal Ttd 格式處理類

/**
 * BloggsCal Ttd 格式處理類
 * Class BloggsTtdEncoder
 */
class BloggsTtdEncoder extends TtdEncoder
{
    public function encode()
    {
        // TODO: Implement encode() method.
        return "Ttd data encoded in BloggsCal format\n";
    }
}

6、創建BloggsCal Contact 格式處理類

/**
 * BloggsCal Contact 格式處理類
 * Class BloggsContactEncoder
 */
class BloggsContactEncoder extends ContactEncoder
{
    public function encode()
    {
        // TODO: Implement encode() method.
        return "Contact data encoded in BloggsCal format\n";
    }
}

7、創建MegaCal Appt 格式處理類

/**
 * MegaCal Appt 格式處理類
 * Class MegaApptEncoder
 */
class MegaApptEncoder extends ApptEncoder
{
    public function encode()
    {
        // TODO: Implement encode() method.
        return "Appointment data encoded in MegaCal format\n";
    }
}

8、創建MegaCal Ttd 格式處理類

/**
 * MegaCal Ttd 格式處理類
 * Class MegaTtdEncoder
 */
class MegaTtdEncoder extends TtdEncoder
{
    public function encode()
    {
        // TODO: Implement encode() method.
        return "Ttd data encoded in MegaCal format\n";
    }
}

9、創建MegaCal Contact 格式處理類

/**
 * MegaCal Contact 格式處理類
 * Class MegaContactEncoder
 */
class MegaContactEncoder extends ContactEncoder
{
    public function encode()
    {
        // TODO: Implement encode() method.
        return "Contact data encoded in MegaCal format\n";
    }
}

10、創建BloggsCal 工廠類

/**
 * BloggsCal 工廠類
 * Class BloggsCommsManager
 */
class BloggsCommsManager extends CommsManager
{
    public function getHeaderText()
    {
        // TODO: Implement getHeaderText() method.
        return "BloggsCal header\n";
    }

    public function getApptEncoder()
    {
        // TODO: Implement getApptEncoder() method.
        return new BloggsApptEncoder();
    }

    public function getTtdEncoder()
    {
        // TODO: Implement getTtdEncoder() method.
        return new BloggsTtdEncoder();
    }

    public function getContractEncoder()
    {
        // TODO: Implement getContractEncoder() method.
        return new BloggsContactEncoder();
    }

    public function getFooterText()
    {
        // TODO: Implement getFooterText() method.
        return "BloggsCal footer\n";
    }
}

11、創建MegaCal 工廠類

/**
 * MegaCal 工廠類
 * Class MegaCommsManager
 */
class MegaCommsManager extends CommsManager
{
    public function getHeaderText()
    {
        // TODO: Implement getHeaderText() method.
        return "MegaCal header\n";
    }

    public function getApptEncoder()
    {
        // TODO: Implement getApptEncoder() method.
        return new MegaApptEncoder();
    }

    public function getTtdEncoder()
    {
        // TODO: Implement getTtdEncoder() method.
        return new MegaTtdEncoder();
    }

    public function getContractEncoder()
    {
        // TODO: Implement getContractEncoder() method.
        return new MegaContactEncoder();
    }

    public function getFooterText()
    {
        // TODO: Implement getFooterText() method.
        return "MegaCal footer\n";
    }
}

12、調用

$mgr = new BloggsCommsManager();
print $mgr->getHeaderText();
print $mgr->getApptEncoder()->encode();
print $mgr->getTtdEncoder()->encode();
print $mgr->getContractEncoder()->encode();
print $mgr->getFooterText();

$mega = new MegaCommsManager();
print $mega->getHeaderText();
print $mega->getApptEncoder()->encode();
print $mega->getTtdEncoder()->encode();
print $mega->getContractEncoder()->encode();
print $mega->getFooterText();

13、結果

BloggsCal header
Appointment data encoded in BloggsCal format
Ttd data encoded in BloggsCal format
Contact data encoded in BloggsCal format
BloggsCal footer
MegaCal header
Appointment data encoded in MegaCal format
Ttd data encoded in MegaCal format
Contact data encoded in MegaCal format
MegaCal footer

 

總結:

1、解除了系統與實現細節間的耦合。我們可以在示常式序中添加或移除任何數量的編碼類型,而不會對系統造成任何影響。
2、我們組合了系統中功能相關的元素。因此,BloggsCommsManager 可以確保只使用與 BloggsCal 格式相關的類。
3、添加新產品會非常痛苦,這是因為我們不僅需要創建新產品的實現類,還需要修改抽象創建者及其所有的實現類來支持這個新產品。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 將指定數字插入到數組的末尾,返回值為 將數組的第一個元素刪除並返回,返回值為 ...
  • 簡單繼承: @extend 繼承 編譯後 關聯屬性繼承: 編譯後 鏈式繼承: 編譯後 偽類繼承: 編譯後 sass嵌套 編譯後 相同的屬性值首碼,也可以用嵌套 編譯後 sass條件控制 @if @else if @else 編譯後 條件判斷語句也可以寫在外面 編譯後 迴圈 @for $i from ...
  • 對前端稍微有點瞭解的初學者都知道,JavaScript是必不可少的工具。毫不誇張的說,大部分網頁都使用了JavaScript,想要成為一個優秀的前端工程師,做出漂亮令用戶滿意的網頁,熟練掌握JavaScript是一個必備技能。本文為新手整理了一篇JavaScript基礎教程入門指南,希望可以幫助編程 ...
  • number類型 編譯後 color類型: 編譯後 string類型 編譯後 list數組類型 nth(list, num) 獲取list數組中的下標為num的元素 註意num下標是從1開始的 編譯後 index(list, str) 返回str在list數組中的下標 編譯後 map 數組類型(有點 ...
  • 當網路中兩個進程需要通信時,我們往往會使用 來實現。 都不陌生。當三次握手成功後,客戶端與服務端就能通信,並且,彼此之間通信的數據包格式都是二進位,由 協議負責傳輸。 當客戶端和服務端取得了二進位數據包後,我們往往需要『萃取』出想要的數據,這樣才能更好的執行業務邏輯。所以,我們需要定義好數據結構來描 ...
  • 腳本的生成過程 添加模板的時候生成script,商家添加商品的時候拷貝相應的script到sku中。 更新運費模板的時候,發消息到消費者,批量更新相關sku的模板信息。 計算過程 緩存數據結構 script和模板id作為sku的一部分存儲是為了計算使用相同模板的sku的總價。 腳本示例 functi ...
  • 圖解Java設計模式之迭代器模式 看一個具體的需求 傳統的方式的問題分析 迭代器模式基本介紹 迭代器模式的原理類圖 迭代器模式應用實例 迭代器模式在JDK - ArrayList 集合應用的源碼分析 迭代器模式的註意事項和細節 看一個具體的需求 編寫程式展示一個學校院繫結構 :需求是這樣,要在一個頁 ...
  • 圖解Java設計模式之訪問者模式 測試系統的需求 傳統方式的問題分析 訪問者模式基本介紹 訪問者模式應用實例 訪問者模式的註意事項和細節 測試系統的需求 1)將人分為男人和女人,對歌手進行測評,看完某個歌手錶演後,得到他們對該歌手的不同評價(評價有不同的種類,比如成功、失敗等)2)傳統方案 傳統方式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...