【23種設計模式】抽象工廠模式(三)

来源:https://www.cnblogs.com/wml-it/archive/2023/08/29/17664187.html
-Advertisement-
Play Games

## 前言 在抽象工廠模式開篇之前,我們先思考一個問題,如果我們要設計一套房子,其他的組件暫時不考慮,我們僅僅考慮房頂、地板、窗戶、房門進行設計。什麼樣的風格暫時未知,可能會有很多種類。可以先設計一套古典風格的房子,再設計一套現代風格的房子,再設計一套歐式風格的房子....這麼多套房子需要設計,需求 ...


前言

在抽象工廠模式開篇之前,我們先思考一個問題,如果我們要設計一套房子,其他的組件暫時不考慮,我們僅僅考慮房頂、地板、窗戶、房門進行設計。什麼樣的風格暫時未知,可能會有很多種類。可以先設計一套古典風格的房子,再設計一套現代風格的房子,再設計一套歐式風格的房子....這麼多套房子需要設計,需求不斷變化,我們該怎麼才能後期的維護和擴展就更有利呢?那當然是減少客戶端代碼與具體產品類之間的依賴,降低了系統的耦合度,這就是抽象工廠模式的優點之處。

抽象工廠模式定義

抽象工廠模式:提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
image

  • 抽象產品類角色(AbstractProduct):為抽象工廠中相互依賴的每種產品定義抽象介面對象,也可以這樣說,有幾種產品,就要聲明幾個抽象角色,每一個抽象產品角色和一種具體的產品相匹配。
  • 具體產品類(ConcreteProduct):具體產品類實現了抽象產品類,是針對某個具體產品的實現的類型。
  • 抽象工廠類角色(Abstract Factory):定義了創建一組相互依賴的產品對象的介面操作,每種操作和每種產品一一對應。
  • 具體工廠類角色(ConcreteFactory):實現抽象類裡面的所有抽象介面操作,可以創建某系列具體的產品,這些具體的產品是“抽象產品類角色”的子類。

抽象工廠模式代碼實現

抽象工廠模式的實現,只需要創建三個類:抽象工廠類,具體風格工廠類和具體產品風格實現類。當然也可以分離成四個類,將設計產品介面從抽象工廠分離出來。以設計歐式風格建築為例:

image

  • 創建抽象工廠類

     /// <summary>
        /// 抽象工廠類,提供創建不同類型房子的介面
        /// </summary>
        public abstract class AbstractFactory
        {
            /// <summary>
            /// 抽象工廠提供創建一系列產品的介面——抽象方法,這裡作為例子,只給出了房頂、地板、窗戶和房門創建介面
            /// 【1】房頂創建介面
            /// </summary>
            /// <returns></returns>
            public abstract Roof CreateRoof();
            /// <summary>
            /// 【2】地板創建介面
            /// </summary>
            /// <returns></returns>
            public abstract Floor CreateFloor();
            /// <summary>
            /// 【3】窗戶創建介面
            /// </summary>
            /// <returns></returns>
            public abstract Window CreateWindow();
            /// <summary>
            /// 【4】房門創建介面
            /// </summary>
            /// <returns></returns>
            public abstract Door CreateDoor();
        }
        
        #region 可以分離出來到單獨Class文件的產品介面
        /// <summary>
        /// 房頂抽象類,子類的房頂必須繼承該類
        /// </summary>
        public abstract class Roof
        {
            /// <summary>
            /// 創建房頂
            /// </summary>
            public abstract void Create();
        }
    
        /// <summary>
        /// 地板抽象類,子類的地板必須繼承該類
        /// </summary>
        public abstract class Floor
        {
            /// <summary>
            /// 創建地板
            /// </summary>
            public abstract void Create();
        }
    
        /// <summary>
        /// 窗戶抽象類,子類的窗戶必須繼承該類
        /// </summary>
        public abstract class Window
        {
            /// <summary>
            /// 創建窗戶
            /// </summary>
            public abstract void Create();
        }
    
        /// <summary>
        /// 房門抽象類,子類的房門必須繼承該類
        /// </summary>
        public abstract class Door
        {
            /// <summary>
            /// 創建房門
            /// </summary>
            public abstract void Create();
        }
    
        #endregion
    
  • 創建歐式風格工廠

     /// <summary>
        /// 歐式風格房子的工廠,負責創建歐式風格的房子
        /// </summary>
        public class EuropeanFactory : AbstractFactory
        {
            // 製作歐式房頂
            public override Roof CreateRoof()
            {
                return new EuropeanRoof();
            }
    
            // 製作歐式地板
            public override Floor CreateFloor()
            {
                return new EuropeanFloor();
            }
    
            // 製作歐式窗戶
            public override Window CreateWindow()
            {
                return new EuropeanWindow();
            }
    
            // 製作歐式房門
            public override Door CreateDoor()
            {
                return new EuropeanDoor();
            }
        }
    
    
  • 創建歐式風格實現

     /// <summary>
        /// European 歐式風格建築
        /// </summary>
        public class European
        {
            /// <summary>
            /// 歐式地板類
            /// </summary>
            public class EuropeanFloor : Floor
            {
                public override void Create()
                {
                    Console.WriteLine("創建歐式的地板");
                }
            }
    
    
            /// <summary>
            /// 歐式的房頂
            /// </summary>
            public class EuropeanRoof : Roof
            {
                public override void Create()
                {
                    Console.WriteLine("創建歐式的房頂");
                }
            }
    
    
            /// <summary>
            ///歐式的窗戶
            /// </summary>
            public class EuropeanWindow : Window
            {
                public override void Create()
                {
                    Console.WriteLine("創建歐式的窗戶");
                }
            }
    
    
            /// <summary>
            /// 歐式的房門
            /// </summary>
            public class EuropeanDoor : Door
            {
                public override void Create()
                {
                    Console.WriteLine("創建歐式的房門");
                }
            }
    
        }
    
  • 歐式風格調用

     public void RunTest()
            {
                // 歐式風格的房子
                Console.WriteLine("開始設計歐式風格房子!");
                AbstractFactory europeanFactory = new EuropeanFactory();
                europeanFactory.CreateRoof().Create();
                europeanFactory.CreateFloor().Create();
                europeanFactory.CreateWindow().Create();
                europeanFactory.CreateDoor().Create();
            }
    

image

如果新需求設計新的風格房子,現代風格建築,只需要創建對應的具體實現工廠和具體產品分風格設計實現。

  • 創建現代風格工廠

     /// <summary>
        /// 現在風格房子的工廠,負責創建現代風格的房子
        /// </summary>
        public class ModernizationFactory : AbstractFactory
        {
            // 製作現代房頂
            public override Roof CreateRoof()
            {
                return new ModernizationRoof();
            }
    
            // 製作現代地板
            public override Floor CreateFloor()
            {
                return new ModernizationFloor();
            }
    
            // 製作現代窗戶
            public override Window CreateWindow()
            {
                return new ModernizationWindow();
            }
    
            // 製作現代房門
            public override Door CreateDoor()
            {
                return new ModernizationDoor();
            }
        }
    
  • 創建現代風格實現

      /// <summary>
        /// Modernization 現代風格建築
        /// </summary>
        public class Modernization
        {
    
            /// <summary>
            /// 現代的房頂
            /// </summary>
            public class ModernizationRoof : Roof
            {
                public override void Create()
                {
                    Console.WriteLine("創建現代的房頂");
                }
            }
    
            /// <summary>
            /// 現代的地板
            /// </summary>
            public class ModernizationFloor : Floor
            {
                public override void Create()
                {
                    Console.WriteLine("創建現代的地板");
                }
            }
    
            /// <summary>
            /// 現代的窗戶
            /// </summary>
            public class ModernizationWindow : Window
            {
                public override void Create()
                {
                    Console.WriteLine("創建現代的窗戶");
                }
            }
    
            /// <summary>
            /// 現代的房門
            /// </summary>
            public class ModernizationDoor : Door
            {
                public override void Create()
                {
                    Console.WriteLine("創建現代的房門");
                }
            }
    
        }
    
  • 現代風格調用

     public void RunTest()
            {
                // 歐式風格的房子
                Console.WriteLine("開始設計歐式風格房子!");
                AbstractFactory europeanFactory = new EuropeanFactory();
                europeanFactory.CreateRoof().Create();
                europeanFactory.CreateFloor().Create();
                europeanFactory.CreateWindow().Create();
                europeanFactory.CreateDoor().Create();
    
    
                //現代風格的房子
                Console.WriteLine("開始設計現代風格的房子!");
                AbstractFactory modernizationFactory = new ModernizationFactory();
                modernizationFactory.CreateRoof().Create();
                modernizationFactory.CreateFloor().Create();
                modernizationFactory.CreateWindow().Create();
                modernizationFactory.CreateDoor().Create();
            }
    

image

抽象工廠模式的優缺點

優點:

【抽象工廠模式】將系列產品的創建工作延遲到具體工廠的子類中,我們聲明工廠類變數的時候是使用的抽象類型,同理,我們使用產品類型也是抽象類型,這樣做就儘可能的可以減少客戶端代碼與具體產品類之間的依賴,從而降低了系統的耦合度。耦合度降低了,對於後期的維護和擴展就更有利,這也就是【抽象工廠模式】的優點所在。

缺點:

【抽象工廠模式】很難支持增加新產品的變化,這是因為抽象工廠介面中已經確定了可以被創建的產品集合,如果需要添加新產品,此時就必須去修改抽象工廠的介面,這樣就涉及到抽象工廠類以及所有子類的改變,這樣也就違背了“開放—封閉”原則。

本文來自博客園,作者:碼農阿亮,轉載請註明原文鏈接:https://www.cnblogs.com/wml-it/p/17664187.html


技術的發展日新月異,隨著時間推移,無法保證本博客所有內容的正確性。如有誤導,請大家見諒,歡迎評論區指正!
開源庫地址,歡迎點亮:
GitHub:https://github.com/ITMingliang
Gitee:   https://gitee.com/mingliang_it
GitLab: https://gitlab.com/ITMingliang

建群聲明: 本著技術在於分享,方便大家交流學習的初心,特此建立【編程內功修煉交流群】,為大家答疑解惑。熱烈歡迎各位愛交流學習的程式員進群,也希望進群的大佬能不吝分享自己遇到的技術問題和學習心得!進群方式:掃碼關註公眾號,後臺回覆【進群】。



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

-Advertisement-
Play Games
更多相關文章
  • ### 前言 AC自動機($Aho\ Corasick\ Atomaton$)有著一種 [$KMP$](https://www.cnblogs.com/pdpdzaa/p/17641166.html) 的思想,所以在學習之前建議先學一下 $KMP$。同時還需要瞭解一下 $Trie$ 樹(建議去看一下 ...
  • `go embed` 是 Go 1.16 中引入的特性,它允許將文件嵌入到 Go 代碼中,以便在運行時訪問這些文件。這對於將靜態資源(如 HTML、CSS、JavaScript 文件)直接嵌入到 Go 二進位文件中,以及簡化文件分發和部署非常有用。下麵是關於 `go embed` 的詳細介紹: ** ...
  • ## 教程簡介 R是用於統計分析、繪圖的語言和操作環境。R是屬於GNU系統的一個自由、免費、源代碼開放的軟體,它是一個用於統計計算和統計製圖的優秀工具。R語言的核心是解釋電腦語言,其允許分支和迴圈以及使用函數的模塊化編程。 R語言允許與以C,C ++,.Net,Python或FORTRAN語言編寫 ...
  • 作者:TinyThing 鏈接:https://www.jianshu.com/p/b52db905f020 ## 0x0 背景 > 項目中使用LocalDateTime系列作為dto中時間的類型,但是spring收到參數後總報錯,為了全局配置時間類型轉換,嘗試瞭如下3中方法。 > > **註:本文 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 本篇是《java與es8實戰》系列的第四 ...
  • 昨天分享了一個在WebApi中如何接收參數的文章 傳送門,然後有新人小伙伴就問了,那文件上傳呢,這個怎麼弄,藉此我寫了一個小demo,分享給大家。 通常來說,上傳文件,我們是使用POST,還是老規矩先上代碼: txt文件 這是需要上傳的txt文件。 指定文件參數名 代碼 [HttpPost("Upl ...
  • ## 前言 在軟體系統中,有時候面臨著“一個複雜對象”的創建工作,其通常由各個部分的子對象用一定的演算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定。如何應對這種變化?如何提供一種“封裝機制”來隔離出“複雜對象的各個部分”的變化,從而保持系統中 ...
  • ##### 常用基本配置項 ```xml net35; net40; net45; net451; net452; net46; net461; net462; net47; net471; net472; net48; netstandard2.0; netstandard2.1; netcore ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...