《設計模式之禪》筆記摘錄 - 4.抽象工廠模式

抽象工廠模式的定義

抽象工廠模式(Abstract Factory Pattern)是一種比較常用的模式,其定義如下:

Provide an interface for creating families of related or dependent objects without specifying ir concrete classes.(為創建一組相關或相互依賴的對象提供一個接口,而且無須指定它們的體類。)

抽象工廠模式是工廠方法模式的升級版本,在多個業務品種、業務分類時,通過抽象工廠模式需要的對象是一種非常好的解決方式。

通用類圖如下:

抽象工廠模式的應用

抽象工廠模式的優點

封裝性,每個產品的實現類不是高層模塊要關心的,它要關心的是什么?是接口,是抽象,它不關心對象是如何創建出來,這由誰負責呢?工廠類,只要知道工廠類是誰,我就能創建出一個需要的對象,省時省力,優秀設計就應該如此。

產品族內的約束為非公開狀態。具體的產品族內的約束是在工廠內實現的。

抽象工廠模式的缺點

抽象工廠模式的最大缺點就是產品族擴展非常困難

抽象工廠模式的使用場景

抽象工廠模式的使用場景定義非常簡單:一個對象族(或是一組沒有任何關系的對象)都有相同的約束,則可以使用抽象工廠模式。

什么意思呢?例如一個文本編輯器和一個圖片處理器,都是軟件實體,但是linix下的文本編輯器和Windows下的文本編輯器雖然功能和界面都相同,但是代碼實現是不同的,圖片處理器也有類似情況。也就是具有了共同的約束條件:操作系統類型。于是我們可以使用抽象工廠模式,產生不同操作系統下的編輯器和圖片處理器。

抽象工廠模式的注意事項

在抽象工廠模式的缺點中,我們提到抽象工廠模式的產品族擴展比較困難,但是一定要清楚,是產品族擴展困難,而不是產品等級。在該模式下,產品等級是非常容易擴展的,增加一個產品等級,只要增加一個工廠類負責新增加出來的產品生產任務即可。也就是說橫向擴展容易,縱向擴展困難。

這一點上看,抽象工廠模式是符合開閉原則的。

最佳實踐

一個模式在什么情況下才能夠使用,是很多讀者比較困惑的地方。抽象工廠模式是一個簡單的模式,使用的場景非常多,大家在軟件產品開發過程中,涉及不同操作系統的時候,都可以考慮使用抽象工廠模式,例如一個應用,需要在三個不同平臺(Windows、Linux、Android)上運行,你會怎么設計?分別設計三套不同的應用?非也,通過抽象工廠模式屏蔽掉操作系統對應用的影響。三個不同操作系統上的軟件功能、應用邏輯、UI都應該是非常類似的,唯一不同的是調用不同的工廠方法,由不同的產品類去處理與操作系統交互的信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/87751.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/87751.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/87751.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python-注釋

文章目錄 單行注釋多行注釋使用多個 # 符號使用三引號( 或 """) 特殊注釋Shebang(Unix/Linux 腳本聲明)編碼聲明(Python 2 需要)文檔字符串(Docstring) 在 Python 中…

YOLO11推理模式:極速高效的目標檢測新選擇

一、引言 在機器學習和計算機視覺領域,模型的推理(Inference)是應用階段的核心。Ultralytics 最新發布的 YOLO11 模型,憑借其強大的predict模式,在保證準確率的同時,極大提升了推理速度和多樣數據源兼容能…

如何創建基于 TypeScript 的 React 項目

React 是一個用于構建用戶界面的強大 JavaScript 庫。結合 TypeScript,您可以獲得類型安全和更好的開發體驗。本文將詳細介紹如何從頭開始創建一個基于 TypeScript 的 React 項目。 1. 為什么選擇 TypeScript? 在深入創建項目之前,我們先了解…

Adobe LiveCycle Designer 中腳本的層級關系

以下是Adobe LiveCycle Designer腳本體系的層級關系對比分析,結合執行時機、作用域、交互規則及典型應用場景進行系統性說明: 1. 腳本體系層級關系總覽 #mermaid-svg-4ZAgQFvRk9BQdPuM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:…

在汽車中實現時間敏感網絡(TSN)

隨著車內以太網應用的不斷擴展,精確的時間同步與可靠的數據傳輸變得至關重要。IEEE 802.1AS? 提供了亞微秒級的高精度時間同步能力,這一特性將在未來汽車通信系統中發揮關鍵作用。 此外,其他 IEEE 標準和 TSN 技術共同支持在整個車輛范圍內實現安全、超高可靠性、低延遲有…

暑假讀書筆記第一天

今日文章: 小林coding:CPU 是如何執行程序的? 目錄 內存中央處理器指令及其周期指令類型MIPS指令類型指令周期 指令的執行速度 馮諾依曼計算機遵循了圖靈機的設計,使用了電子元件構造,約定了用二進制進行計算和存儲 圖靈機基本由紙帶和和讀…

洛谷刷題9

B4355 [GESP202506 一級] 值日 B4355 [GESP202506 一級] 值日 - 洛谷 難度&#xff1a;入門 —— 入門 這道題有三種解法&#xff0c;第三種解法在一部分比賽中被禁用 AC代碼&#xff08;第一種方法&#xff1a;循環&#xff09; #include <iostream> #include <…

vuedraggable在iframe中無法使用問題

廢話不多說 直接看怎么解決 <draggable:list"staticContent":animation"340"group"selectItem"handle".option-drag"start"onDragStart"end"onDragEnd" ><divv-for"(item, index) in staticConten…

數據庫窗口函數詳解:語法、技巧與最佳實踐

數據庫窗口函數詳解&#xff1a;語法、技巧與最佳實踐 窗口函數是SQL中用于執行復雜分析的強大工具&#xff0c;它允許在結果集的"窗口"&#xff08;一組相關行&#xff09;上進行計算&#xff0c;而不會將行分組為單個輸出行。下面我將全面解析窗口函數的語法、應用…

基于開源AI大模型AI智能名片S2B2C商城小程序源碼的企業資金使用效率提升路徑研究

摘要&#xff1a;在中國創業市場&#xff0c;需求驗證后的激烈競爭與投資方對收益率和確定性的嚴苛要求&#xff0c;迫使企業必須實現資金使用的極致效率。開源AI大模型AI智能名片S2B2C商城小程序源碼的技術融合&#xff0c;通過重構用戶觸達、供應鏈協同與運營流程&#xff0c…

2025年- H92-Lc200-- 64.最小路徑和(多維動態規劃)--Java版

1.題目描述 2.思路 &#xff08;1&#xff09;dp[i][j] 表示從起點 (0,0) 走到位置 (i,j) 的最小路徑和 &#xff08;2&#xff09;對于位置 (i, j)&#xff0c;只能從 上面 (i-1,j) 或 左邊 (i,j-1) 走過來&#xff0c;所以&#xff1a; dp[i][j] grid[i][j] min(dp[i-1][j…

CHAIN(GAN的一種)訓練自己的數據集

簡介 簡介:作者針對數據有限場景下GANs訓練中的判別器過擬合問題,提出了CHAIN(Lipschitz連續性約束歸一化)方法。作者首先從理論角度分析了GAN泛化誤差,發現減少判別器權重梯度范數對提升泛化能力至關重要。然后深入研究了批歸一化(BN)在GAN判別器中應用困難的根本原因…

3D建模公司的能力與技術

在數字化時代&#xff0c;3D建模公司扮演著越來越重要的角色。它們是專業從事三維建模設計服務的機構或團隊&#xff0c;利用先進的三維建模軟件和技術&#xff0c;為客戶提供從概念設計到最終成品的全流程服務。這些服務廣泛應用于建筑設計、工程規劃、產品設計、動畫制作等多…

《深度剖析:5G網絡切片如何精準保障不同業務QoS需求》

5G網絡切片技術依托網絡功能虛擬化(NFV)和軟件定義網絡(SDN)兩大核心技術。NFV就像一位神奇的變形師,把傳統硬件網絡功能,如路由器、防火墻、基站等,轉化為軟件模塊,讓它們能運行在通用硬件平臺上。如此一來,硬件資源得以擺脫傳統網絡功能的束縛,實現靈活調配。例如,…

力扣hot100題(1)

目錄 1、兩數之和2、移動零3、相交鏈表4、有效的括號5、反轉鏈表6、回文鏈表7、環形鏈表8、環形鏈表II9、合并兩個有序鏈表10、二叉樹的中序遍歷 1、兩數之和 1. 兩數之和 - 力扣&#xff08;LeetCode&#xff09; 方法1&#xff1a; class Solution {public int[] twoSum(i…

C++的回顧與學習之C++入門基礎

目錄 1、C入門 1&#xff09;C關鍵字 2&#xff09;命名空間 3&#xff09;C中的輸入輸出 4&#xff09;缺省參數 5&#xff09;函數重載 6&#xff09;引用 引用和指針的不同點&#xff1a; 7&#xff09;auto關鍵字 8&#xff09;內聯函數 9&#xff09;指針空值nu…

【使用Android Studio調試手機app時候手機老掉線問題】

如果你各種方式都嘗試失敗了&#xff0c; 請看這里 連接時候通過logcat查看你手機Android的平臺去SDK下載所有對應的平臺SDK重新連接嘗試

二叉樹題解——驗證二叉搜索樹【LeetCode】前序遍歷

98. 驗證二叉搜索樹 &#x1f50d; 題目目標 判斷一棵二叉樹是否為有效的二叉搜索樹&#xff08;BST&#xff09;&#xff0c;定義如下&#xff1a; 左子樹所有節點 < 根節點 右子樹所有節點 > 根節點 且左右子樹也必須是二叉搜索樹 一、算法邏輯&#xff08;逐步通…

Javaweb - 10.3 Servlet 生命周期

目錄 生命周期簡介 生命周期測試 load-on-startup 補充&#xff1a;defaultServlet Servlet 的繼承結構 1. 頂級的 Servlet 接口 2. 抽線的類 GenericServlet 3. HttpServlet 抽象類 4. 自定義 Servlet 補充&#xff1a; 完&#xff01; 生命周期簡介 什么是生命周…

RSA數字簽名方案的C語言實現(帶測試)

RSA 算法的 C語言實現通常比較復雜&#xff0c;但已經有許多密碼算法庫實現了 RSA 算法&#xff0c;例如OpenSSL、Libgcrypt? 和 Botan ?等。我們可以在這些庫的基礎上進行配置或移植&#xff0c;從而快速實現密碼算法。但這些庫主要面向大量設備進行優化&#xff0c;如通用計…