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 Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...