設計模式入門:抽象工廠模式 Abstract Factory Pattern

閱讀時間約 3 分鐘

在學習設計模式時,可能會讓人感到困惑:「為什麼有這麼多種工廠模式?它們到底解決什麼問題?」工廠方法模式(Factory Method Pattern)提供了一種方式來建立單一物件,這個方法可以在子類中覆寫以產生不同的物件。而抽象工廠模式(Abstract Factory Pattern)在這個基礎上進一步擴展,允許我們建立一系列相關的物件,這對於需要組織和管理大型系統非常有幫助。


今天我們來用一個GUI(圖形使用者介面)的例子解釋這個概念。


什麼是抽象工廠模式?

抽象工廠模式的核心思想是提供一個通用的介面,讓客戶端可以建立一系列相關的物件,而不必指定具體類型。這對於需要產生不同風格的GUI元件特別適合。比如說,你正在開發一個跨平台的應用程式,這個程式可以在Windows、macOS、Linux等多個平台上運行,每個平台都有自己獨特的界面風格。通過抽象工廠模式,你可以為每個平台生成相應的元件,而不必更改核心邏輯。


GUI元件的應用

假設你正在開發一個應用程式,它需要在Windows和Mac平台上執行。每個平台有自己獨特的風格,Windows有一種風格的按鈕和文字框,而Mac則有另一種風格。為了讓你的應用程式能夠適應這些不同的風格,你可以使用抽象工廠模式來解決這個問題。


抽象工廠模式就像是一個通用的「工廠大樓」,裡面有不同的生產線(即不同的具體工廠),每條生產線專門生產特定平台的元件。當你需要產生Windows風格的按鈕和文字框時,你會去「Windows生產線」;當你需要Mac風格的元件時,就去「Mac生產線」。這樣你的程式碼只需要知道這些「生產線」,而不需要關心它們內部的具體實現。


具體來說,這個「工廠大樓」會提供一些介面(即抽象工廠),這些介面定義了如何建立不同的元件,比如按鈕和文字框。每一條「生產線」會實現這些介面,並生產對應風格的元件。例如,Windows的生產線會生產Windows風格的按鈕和文字框,而Mac的生產線會生產Mac風格的元件。


這樣的設計讓你的程式碼能夠輕鬆切換不同的風格,並且當你未來需要支持新的平台時,只需要新增一條「生產線」,不需要改動現有的程式碼。不僅讓你的系統更具擴展性,還能保持一致的風格,讓你的應用程式在不同平台上看起來都很協調。


當應用程式需要按鈕和文字框時,它不需要知道具體是哪一個平台的元件,只需要知道使用哪個工廠來產生就好。


抽象工廠模式優缺點

抽象工廠模式的優點在於能夠幫助整體系統的一致性,像是跨平台應用的介面風格,或者像是特斯拉工廠同時生產不同車型的零件。另外當我們需要支援新的平台或改變應用風格時,只需新增一個工廠類別,讓程式碼更易於擴展。


但它的缺點是系統的複雜性可能會增加,特別是在專案規模較小時,使用這種模式可能會顯得繁瑣。還有如果需要新增一個產品類型,所有的工廠類別都得更新,這會影響到開放封閉原則。


總結一下,抽象工廠模式讓我們在建立一系列相關物件時,能夠保持系統的一致性和靈活性,適用於像是跨平台應用或需要不同風格元件的場景。下次面對這樣的需求時,可以考慮使用抽象工廠模式來解決問題!


若你想要體驗設計模式的力量,看看我在iThome鐵人賽的文章吧。
https://ithelp.ithome.com.tw/articles/10352649

    6會員
    83內容數
    對於經營自媒體、部落格或社群媒體感興趣?我專注於提供實用的寫作技巧、數位行銷策略,以及個人成長建議。 每週,我會分享提升寫作技巧、優化部落格經營、有效管理社群媒體、以及投資理財的寶貴知識。追蹤我,獲得實用的工具和建議,讓你的個人品牌和財務管理更上一層樓!
    留言0
    查看全部
    發表第一個留言支持創作者!
    ShengYu的沙龍 的其他內容
    想像你是一位探險家,走進了一座神秘古城。這座城裡有著各種各樣的建築:宏偉的宮殿、莊嚴的神廟、熱鬧的市集。每個地方都有它獨特的風格和探索方式。作為探險家,你必須用不同的方法來了解每個地方,但你不需要改變這些建築本身,只要隨著地方變化調整探索的方式。這就是訪問者模式的精髓! 什麼是訪問者模式?
    想像你有一個非常珍愛的玩偶,這個玩偶獨一無二。如果你想要再擁有一個完全相同的玩偶,你會怎麼做呢?自己重新製作一個,可能需要很多時間和心力,但如果有一台神奇的「複製機」,只需按下按鈕,就可以立即產生一個一模一樣的玩偶,這會不會很輕鬆方便?這就是「原型模式(Prototype Pattern)」的核心概
    你有沒有玩過大型多人線上遊戲(MMO)?畫面上常常出現數百甚至數千名玩家,每個人都有不同的外觀和裝備。這時你有沒有想過,遊戲是怎麼在記憶體不爆炸的情況下管理這麼多角色的?其中一個祕密就是「享元模式」! 什麼是享元模式? 享元模式是一種設計模式,專門用來解決當系統中有大量相似物件時,如何有效減
    大家有沒有想過,當你在終端機輸入指令,或是用正則表達式進行搜尋時,背後的運作原理是什麼?這些操作看似複雜,但其實背後隱藏著一個叫做「解釋器模式」的設計模式,今天就來聊聊這個神奇的模式。 什麼是解釋器模式? 簡單來說解釋器模式是一種用來處理語法規則的設計模式。它的運作方式就像我們學習一門語言,
    想像一下你家裡的電視遙控器。這個遙控器能夠控制不同品牌的電視,無論是開機、關機還是調整音量,它都能輕鬆搞定。遙控器就像是橋接不同電視的中介,讓你只需要按下按鈕,就能控制電視,而不用擔心每台電視的內部細節。這就是橋接模式的精髓:把「操作」和「具體實現」分開,讓它們可以獨立發展。 什麼是橋接模式?
    想像一下你在公司遇到一個棘手的問題。你會怎麼做?通常的做法是先跟你的主管報告,發現他解決不了,就再往上報告給更高層的主管,如果還是解決不了就再往上報告給更高層,這樣層層往上,直到有人可以處理為止。這就是「責任鏈模式」的概念,將任務一步步傳遞,直到問題被解決。 什麼是責任鏈模式? 責任鏈模式是
    想像你是一位探險家,走進了一座神秘古城。這座城裡有著各種各樣的建築:宏偉的宮殿、莊嚴的神廟、熱鬧的市集。每個地方都有它獨特的風格和探索方式。作為探險家,你必須用不同的方法來了解每個地方,但你不需要改變這些建築本身,只要隨著地方變化調整探索的方式。這就是訪問者模式的精髓! 什麼是訪問者模式?
    想像你有一個非常珍愛的玩偶,這個玩偶獨一無二。如果你想要再擁有一個完全相同的玩偶,你會怎麼做呢?自己重新製作一個,可能需要很多時間和心力,但如果有一台神奇的「複製機」,只需按下按鈕,就可以立即產生一個一模一樣的玩偶,這會不會很輕鬆方便?這就是「原型模式(Prototype Pattern)」的核心概
    你有沒有玩過大型多人線上遊戲(MMO)?畫面上常常出現數百甚至數千名玩家,每個人都有不同的外觀和裝備。這時你有沒有想過,遊戲是怎麼在記憶體不爆炸的情況下管理這麼多角色的?其中一個祕密就是「享元模式」! 什麼是享元模式? 享元模式是一種設計模式,專門用來解決當系統中有大量相似物件時,如何有效減
    大家有沒有想過,當你在終端機輸入指令,或是用正則表達式進行搜尋時,背後的運作原理是什麼?這些操作看似複雜,但其實背後隱藏著一個叫做「解釋器模式」的設計模式,今天就來聊聊這個神奇的模式。 什麼是解釋器模式? 簡單來說解釋器模式是一種用來處理語法規則的設計模式。它的運作方式就像我們學習一門語言,
    想像一下你家裡的電視遙控器。這個遙控器能夠控制不同品牌的電視,無論是開機、關機還是調整音量,它都能輕鬆搞定。遙控器就像是橋接不同電視的中介,讓你只需要按下按鈕,就能控制電視,而不用擔心每台電視的內部細節。這就是橋接模式的精髓:把「操作」和「具體實現」分開,讓它們可以獨立發展。 什麼是橋接模式?
    想像一下你在公司遇到一個棘手的問題。你會怎麼做?通常的做法是先跟你的主管報告,發現他解決不了,就再往上報告給更高層的主管,如果還是解決不了就再往上報告給更高層,這樣層層往上,直到有人可以處理為止。這就是「責任鏈模式」的概念,將任務一步步傳遞,直到問題被解決。 什麼是責任鏈模式? 責任鏈模式是
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    這篇內容,將會講解什麼是方法,以及與方法相關的知識。包括定義Method、Method Variable 方法變數、跨區使用Method、使用函式時要注意括號。
    Thumbnail
    這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    ※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    Thumbnail
    先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
    物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
    Thumbnail
    先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    美國總統大選只剩下三天, 我們觀察一整週民調與金融市場的變化(包含賭局), 到本週五下午3:00前為止, 誰是美國總統幾乎大概可以猜到60-70%的機率, 本篇文章就是以大選結局為主軸來討論近期甚至到未來四年美股可能的改變
    Thumbnail
    這篇內容,將會講解什麼是方法,以及與方法相關的知識。包括定義Method、Method Variable 方法變數、跨區使用Method、使用函式時要注意括號。
    Thumbnail
    這一章節旨在介紹 PHP 中的物件導向編程(OOP)概念。通過詳細講解類別、建構子、訪問修飾符(公開、私有、受保護)、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型和反射等概念,使讀者能夠理解和應用這些 OOP 技術來編寫更具結構性和可維護性的 PHP 代碼。
    Thumbnail
    最近觀察到許多網站有一個特性,就是有些網站會使用不同的模板做同一個關鍵字。 很多開發者在做產品的時候會有一個特性,就是會使用相同的模板。使用相同模板的好處不外乎是減少重複開發的時間、快速上站。 因為其實在程式開發中有很多功能可能是相似甚至是重複的。在這種情況下我們不應該重複去開發相同功能,而
    Thumbnail
    這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    ※ 工廠模式 定義: 工廠模式是一種實現了「工廠」概念的物件導向設計模式。它提供一個通用的工廠介面,將創建instance(實例)的程式碼交由子類別各自實現,並根據需求去動態地生成相應的物件。這種模式將物件的創建邏輯與使用邏輯分開,使程式碼更容易維護和擴展。 特點: 具有高度標準化和同質性的
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    Thumbnail
    先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
    物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
    Thumbnail
    先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。