【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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...