設計模式(二)工廠方法

来源:https://www.cnblogs.com/WinterSir/archive/2023/08/18/16646963.html
-Advertisement-
Play Games

##一、前言 **工廠模式常見的詞:簡單工廠、工廠方法、抽象工廠。簡單工廠不屬於23種經典設計模式,但通常將它作為學習其他工廠模式的基礎。** ##二、簡單工廠 ###1、定義 **定義一個工廠類,它可以根據參數的不同返回不同類型的實例,被創建的實例通常都具有共同的父類。由於簡單的工廠模式中用於創建 ...


一、前言

工廠模式常見的詞:簡單工廠、工廠方法、抽象工廠。簡單工廠不屬於23種經典設計模式,但通常將它作為學習其他工廠模式的基礎。

二、簡單工廠

1、定義

定義一個工廠類,它可以根據參數的不同返回不同類型的實例,被創建的實例通常都具有共同的父類。由於簡單的工廠模式中用於創建實例的方法通常是靜態方法,所以簡單工廠又被稱作為靜態工廠。

2、例子

例:開發一套圖表庫,根據不同的參數可以創建柱狀圖BarChart,直線圖LineChart,餅狀圖PieChart,下麵使用簡單工廠來實現。
Chart:抽象圖表介面,充當抽象產品類

namespace _02_FactoryMethod
{
    internal interface Chart
    {
        void Display();
    }
}

BarChart:柱狀圖類,充當具體產品類

namespace _02_FactoryMethod
{
    class BarChart : Chart
    {
        public BarChart()
        {
            Console.WriteLine("創建柱狀圖");
        }

        public void Display()
        {
            Console.WriteLine("顯示柱狀圖");
        }
    }
}

LineChart:折線圖類,充當具體產品類

namespace _02_FactoryMethod
{
    internal class LineChart : Chart
    {
        public LineChart()
        {
            Console.WriteLine("創建折線圖");
        }

        public void Display()
        {
            Console.WriteLine("顯示折線圖");
        }
    }
}

PieChart:餅圖類,充當具體產品類

namespace _02_FactoryMethod
{
    internal class PieChart : Chart
    {
        public PieChart()
        {
            Console.WriteLine("創建餅圖");
        }

        public void Display()
        {
            Console.WriteLine("顯示餅圖");
        }
    }
}

ChartFactory:圖表工廠類,充當工廠類

namespace _02_FactoryMethod
{
    internal class ChartFactory
    {
        public static Chart GetChart(string type)
        {
            Chart chart = null;
            if (type.Equals("bar"))
            {
                chart = new BarChart();
            }
            else if (type.Equals("line"))
            {
                chart = new LineChart();
            }
            else if (type.Equals("pie"))
            {
                chart = new PieChart();
            }
            return chart;
        }
    }
}

Program:測試代碼

Chart chart = ChartFactory.GetChart("bar");
chart.Display();

簡單工廠也可以再簡化,直接將抽象類和工廠類合併,因為並不是所有類型的產品都那麼複雜。

3、總結

實際應用中,簡單工廠肯定是難當大任的,工廠類職責過重,一旦出現問題,整個程式直接崩潰,而且產品類不易拓展,新增就意味著改代碼。當然,如果只是一個簡單程式,配合使用反射、配置文件等手段可以快速完成開發,相信大家都“吃過豬肉也見過豬跑”。

三、工廠方法

1、定義

定義一個用於創建對象的介面,但是讓子類決定將哪一個實例化。工廠方法模式讓一個類的實例化延遲到其子類,是一種創建型模式。與簡單工廠相比,引入了抽象工廠角色。工廠方法模式包含以下四個角色:

1、Product(抽象產品):它是定義產品的介面,是工廠方法模式所創建對象的超類型,也就是產品對象的公共父類。
2、ConcreteProduct(具體產品):它實現了抽象產品介面,某種類型的具體產品由專門的具體工廠創建,具體工廠和具體產品之間一一對應。
3、Factory(抽象工廠):在抽象工廠類中,聲明瞭工廠方法(Factory Method),用於返回一個產品。抽象工廠是工廠方法模式的核心,所有創建對象的工廠類都必須實現該介面。
4、ConcreteFactory(具體工廠):它是抽象工廠類的子類,實現了在抽象工廠中聲明的工廠方法,由客戶端調用,返回一個具體產品類的實例。

2、例子

例:系統封裝多種記錄日誌方式,包括文件記錄日誌、資料庫記錄日誌等,可以根據需求切換。
LoggerFactory:抽象產品工廠介面,供具體產品(資料庫記錄日誌、文件記錄日誌)工廠繼承,實現創建具體產品類的方法

public interface LoggerFactory
{
    public Logger CreateLogger();
}

DataBaseLoggerFactory:資料庫記錄日誌工廠類,繼承抽象產品工廠介面

public class DataBaseLoggerFactory : LoggerFactory
{
    public Logger CreateLogger()
    {
        //創建資料庫業務代碼略
        Logger logger = new DataBaseLogger();
        return logger;
    }
}

FileLoggerFactory:文件記錄日誌工廠類,繼承抽象產品工廠介面

public class FileLoggerFactory : LoggerFactory
{
    public Logger CreateLogger()
    {
        //創建文件業務代碼略
        Logger logger = new FileLogger();
        return logger;
    }
}

Logger:抽象產品介面,供具體產品類繼承,實現記錄日誌的具體方法

public interface Logger
{
    void WriteLog();
}

DataBaseLogger:資料庫記錄日誌類,繼承抽象產品

public class DataBaseLogger : Logger
{
    public void WriteLog()
    {
        Console.WriteLine("資料庫記錄日誌");
    }
}

FileLogger:文件記錄日誌類,繼承抽象產品

public class FileLogger : Logger
{
    public void WriteLog()
    {
        Console.WriteLine("文件記錄日誌");
    }
}

Program:客戶端測試類

LoggerFactory loggerFactory = new DataBaseLoggerFactory();
Logger logger = loggerFactory.CreateLogger();
logger.WriteLog();

3、總結

工廠方法模式除了包含簡單工廠的優點,還彌補了不足,當需要添加新產品時,只需要添加一個具體工廠和具體產品即可,無需改動已有代碼,增強系統可擴展性,符合開閉原則。當然這同時也增加了系統的理解難度,具體產品類過多的話,系統將變得無比龐大。

測試簽名
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ##### 5 表單標簽 表單主要是用來收集客戶端提供的相關信息,提供了用戶數據錄入的方式,有多選、單選、單行文本、下拉列表等輸入框,便於網站管理員收集用戶的數據,是Web瀏覽器和Web伺服器之間實現信息交流和數據傳遞的橋梁. 表單被form標簽包含,內部使用不同的表單元素來呈現不同的方式來供用戶輸 ...
  • 說起數據載入的機制,有一個繞不開的話題就是前端性能,很多電商門戶的首頁其實都會做一些垂直的定製優化,比如讓請求在頁面最早載入,或者在前一個頁面就進行預載入等等。 ...
  • ##### 1 JavaScript的引入方式 JavaScript, 是一門能夠運行在瀏覽器上的腳本語言. 簡稱JS. 首先, Javascript這個名字的由來就很有意思, 不少人認為Javascript和Java貌似很像. 容易想象成Java的腳本. 但其實不然, 兩者之間沒有任何關係. 純粹 ...
  • ##### 4 表格標簽 表格標簽也是一種複合標簽。由:table,tr,td,th,thead,tbody組合,由行和列組合成,行和列交叉的地方就是單元格。在HTML中使用table來定義表格。網頁的表格和辦公軟體裡面的xls一樣,都是有行有列的。HTML使用tr標簽定義行,使用td標簽定義列。 ...
  • 隨著互聯網的發展,PDF 文件在信息交流和文檔分享中起著重要的作用。通過在 Vue 組件中實現 PDF 預覽功能,我們可以為用戶提供便捷的內容閱讀體驗。 通過閱讀本文,讀者將瞭解如何在 Vue 中實現強大的 PDF 預覽功能,為用戶提供方便的閱讀體驗。無論你是剛入門的 Vue 開發者,還是有一定經... ...
  • ##### 2 超鏈接標簽 超鏈接是瀏覽者和伺服器的交互的主要手段,也叫超級鏈接或a鏈接,是網頁中指向一個目標的連接關係,這個目標可以是網頁、網頁中的具體位置、圖片、郵件地址、文件、應用程式等。 超鏈接是網頁中最重要的元素之一。一個網站的各個網頁就是通過超鏈接關聯起來的,用戶通過點擊超鏈接可以從一個 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230816164601035-688425072.png) # 1. 變化就是軟體的特性 ## 1.1. 變化保證天天有,存活保障無處尋 ## 1.2. 非每一款軟體每天都需 ...
  • 1. 概述 對於分散式系統,人們首先對現實中的分散式系統進行高層抽象,然後做出各種假設,發展了諸如CAP, FLP 等理論,提出了很多一致性模型,Paxos 是其中最璀璨的明珠。我們對分散式系統的時序,複製模式,一致性等基礎理論特別關註。 在共識演算法的基礎上衍生了選舉演算法,並且為分散式事務提供了部分 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...