C# 簡單工廠模式:構建靈活與可擴展的面向對象程序

在面向對象編程(OOP)的世界中,簡單工廠模式(Simple Factory Pattern) 是一種非常常見且實用的設計模式。雖然它并不屬于GoF(Gang of Four)定義的23種經典設計模式之一,但它是理解更復雜模式(如工廠方法模式)的重要鋪墊。本文將深入解析簡單工廠模式的工作原理、實現方式及其在實際項目中的作用。


一、什么是簡單工廠模式?

簡單工廠模式是一種創建型設計模式,它的核心思想是:根據輸入的參數或條件,返回一個特定類的實例。這些類通常繼承自同一個基類或接口,具有相同的方法簽名,但方法的具體實現可能不同。

簡單工廠模式通過一個“工廠”類來封裝對象的創建邏輯,使得客戶端無需關心具體的對象創建過程,只需要調用工廠提供的接口即可獲取所需對象。


二、簡單工廠模式的結構解析

我們通過一個類圖來理解簡單工廠模式的核心組成部分:

  • 基類(Base Class):定義了所有子類共有的接口。
  • 具體類(Concrete Classes):繼承自基類,實現具體的業務邏輯。
  • 工廠類(Factory Class):根據傳入的參數決定返回哪一個具體類的實例。

以一個名字解析器為例,假設我們有如下類結構:

  • Namer:基類,提供基礎屬性和方法。
  • FirstFirst:表示“firstname lastname”格式。
  • LastFirst:表示“lastname, firstname”格式。
  • NamerFactory:簡單工廠類,根據輸入判斷使用哪個具體類解析名字。

三、一個C#示例:名字解析器

1. 定義基類 Namer

public class Namer
{protected string frName, lName;public string GetFrname(){return frName;}public string GetLname(){return lName;}
}

該類定義了兩個受保護的字段 frNamelName,并提供公共方法來獲取它們。


2. 實現具體類 FirstFirstLastFirst

FirstFirst 類處理“firstname lastname”格式:

public class FirstFirst : Namer
{public FirstFirst(string name){int i = name.Trim().IndexOf(" ");if (i > 0){frName = name.Substring(0, i).Trim();lName = name.Substring(i + 1).Trim();}else{lName = name;frName = "";}}
}

LastFirst 類處理“lastname, firstname”格式:

public class LastFirst : Namer
{public LastFirst(string name){int i = name.IndexOf(",");if (i > 0){lName = name.Substring(0, i);frName = name.Substring(i + 1).Trim();}else{lName = name;frName = "";}}
}

這兩個派生類都通過構造函數對傳入的字符串進行解析,并將結果保存在基類字段中。


3. 構建簡單工廠類 NamerFactory

public class NamerFactory
{public Namer CreateNamer(string name){if (name.Contains(","))return new LastFirst(name);elsereturn new FirstFirst(name);}
}

工廠類根據輸入是否包含逗號來決定返回哪一個具體類的實例。


4. 客戶端調用示例

class Program
{static void Main(string[] args){NamerFactory factory = new NamerFactory();Namer namer1 = factory.CreateNamer("John Doe");Console.WriteLine($"First Name: {namer1.GetFrname()}, Last Name: {namer1.GetLname()}");Namer namer2 = factory.CreateNamer("Doe, John");Console.WriteLine($"First Name: {namer2.GetFrname()}, Last Name: {namer2.GetLname()}");}
}

輸出結果:

First Name: John, Last Name: Doe
First Name: John, Last Name: Doe

四、簡單工廠模式的優點與局限

? 優點:

  1. 封裝對象創建邏輯:客戶端不需要關心具體類的創建過程,只需調用工廠接口。
  2. 提高可擴展性:新增一個具體類只需修改工廠邏輯,而不影響已有代碼。
  3. 統一接口:所有返回對象都繼承自同一個基類或接口,便于統一調用。

?? 局限:

  1. 違反開放封閉原則:每次新增一個具體類,都需要修改工廠類的判斷邏輯。
  2. 不適合大規模擴展:當具體類數量激增時,判斷邏輯會變得復雜且難以維護。
  3. 不屬于GoF模式:不被廣泛認為是“標準”的設計模式,需謹慎使用。

五、簡單工廠模式的適用場景

  1. 產品種類有限:適用于需要創建的對象類型不多的場景。
  2. 簡化客戶端調用:當客戶端不希望處理復雜的對象創建邏輯時。
  3. 作為工廠方法模式的前奏:為后續引入更高級的工廠方法模式打下基礎。

六、從簡單工廠到工廠方法模式的演進

簡單工廠模式雖然實用,但其“集中決策”的特性限制了它的擴展性。在工廠方法模式中,每個具體類都有自己的工廠類,客戶端通過調用不同的工廠來獲取實例,從而實現對擴展開放、對修改關閉的設計原則。

例如:

public interface INamerFactory
{Namer CreateNamer(string name);
}public class FirstFirstFactory : INamerFactory 
{public Namer CreateNamer(string name){return new FirstFirst(name);}
}

這種結構允許系統在不修改現有代碼的情況下靈活擴展新的產品類型。


結語:選擇合適的模式,構建高質量系統

簡單工廠模式作為一個輕量級的設計模式,非常適合在中小型項目或模塊中使用。它可以幫助我們快速實現對象的創建邏輯封裝,提高代碼的可讀性和可維護性。然而,隨著業務邏輯的復雜化和對象種類的增加,我們應考慮向更高級的設計模式(如工廠方法模式、抽象工廠模式)進行演進。

設計模式的本質,不是為了炫技,而是為了更好地組織代碼、提高系統的可維護性與可擴展性。


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

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

相關文章

全面解析JVM預熱:原理、價值與實踐指南

在Java應用的性能優化領域,“JVM預熱”是一個常被提及卻容易被忽視的關鍵環節。尤其是在高并發、低延遲的業務場景中,未經過充分預熱的JVM可能導致應用啟動初期出現響應延遲、吞吐量波動甚至服務不可用的問題。本文將從JVM預熱的核心原理出發,深入剖析其價值、常見實現方案及…

數學建模-灰色關聯分析(GRA)

目錄 1-AI帶你認識GRA 📘 一、灰色關聯分析(GRA)簡介 1. 什么是灰色關聯分析? 2. 核心思想(通俗理解): 3. 與熵權法的對比(快速類比): 🧩 二…

Shell腳本-expect

一、前言在 Linux 系統管理與自動化運維中,我們經常需要編寫 Shell 腳本來完成各種任務。但有些命令(如 ssh、scp、passwd、ftp 等)在執行時會等待用戶手動輸入密碼或確認信息,這就導致腳本無法完全自動化運行。為了解決這個問題&…

Conmi的正確答案——Ubuntu24.04禁用任何休眠

系統:Ubuntu 24.04步驟一、禁用系統休眠服務 # 禁用所有休眠/待機相關服務(立即生效) sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target # 驗證狀態(顯示 "masked" 即成功&am…

開源 C++ QT Widget 開發(二)基本控件應用

文章的目的為了記錄使用C 進行QT Widget 開發學習的經歷。臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 C QT Widget 開發(一)工程文件結構-CSDN博客 開源 C…

今日科技風向|從AI芯片定制到閱兵高科技展示——聚焦技術前沿洞察

今日科技風向|從AI芯片定制到閱兵高科技展示——聚焦技術前沿洞察 一、NVIDIA 開發“黑曜”子版 AI 芯片 B30A,瞄準中國市場 今日報道指出,NVIDIA 正在研發一款面向中國市場的定制芯片 B30A,基于其先進的 Blackwell 架構&#xff…

Elasticsearch官方文檔學習-未完待續

Elasticsearch官方文檔學習-未完待續說明快速開始基礎知識索引組成1. 文檔 (Documents)2. 元數據字段(Metadata fields)3. 映射和數據類型(Mappings and data types)文檔操作(Document)批量創建或者刪除文檔 (Bulk index or delete documents)樂觀并發控制 Optimistic concurre…

Redis資料

Redis是什么? Redis(Remote Dictionary Server)是一個開源的、基于內存的鍵值數據庫,支持多種數據結構,可用作數據庫、緩存和消息中間件。主要特點包括: 基于內存操作,讀寫性能極高支持持久化,可將內存數…

CAMEL-Task2-Agent的構成組件

CAMEL-Task2-Agent的構成組件 本文筆記主要關于2.7章節:CAMEL框架中agents如何使用工具。 一、工具說明 為什么要額外使用工具? agents本身的知識和能力有限,比如一些問題需要聯網搜索才能準確回答(而不是亂答,即“…

數據整理自動化 - 讓AI成為你的數據助手

文章目錄數據整理自動化 - 讓AI成為你的數據助手引言:數據整理的時代挑戰與機遇1. 常見數據整理場景分析1.1 數據整理的多元場景圖譜1.2 數據質量問題的分類與影響1.3 傳統處理方法的局限性2. AI與傳統腳本的協同工作流2.1 智能數據整理架構設計2.2 協同工作流的最佳…

react速成

項目目錄package.json文件:包含核心兩個依賴(react、react-dom)和命令(start、bulid)src:源碼目錄,開始之用的到index.js和App.jsindex.js:是項目的入口,一切的運行起點/…

Maven的進階使用(上)

pom.xml文件 就像 Make 的 MakeFile、Ant 的 build.xml 一樣,Maven 項目的核心是 pom.xml。POM(全稱 Project Object Model,項目對象模型 ) 定義了項目的基本信息,用于描述項目如何構建,聲明項目依賴,等等。 Gredele--…

【最后203篇系列】034 使用SQLite構建簡單的任務管理

表數據同步的斷點續傳 有時候需要將一個表的數據復制到另一個表,循環是常用的方式。當表比較大,執行的時間很長,會有很多因素引起失敗。我希望可以比較簡單的跑數,所以做一個簡單的任務系統。 SQLitre是嵌入式數據庫,這…

SpringCloud Alibaba核心知識點

Spring Cloud Alibaba 是阿里巴巴開源的一套微服務解決方案,與 Spring Cloud 生態深度集成。以下是其主要組件及其功能:Nacos服務注冊與發現:支持動態服務注冊、健康監測及DNS-Based服務發現。配置中心:提供分布式配置管理&#x…

LeetCode 分類刷題:34. 在排序數組中查找元素的第一個和最后一個位置

題目給你一個按照非遞減順序排列的整數數組 nums,和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。如果數組中不存在目標值 target,返回 [-1, -1]。你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。示例 1:…

自建知識庫,向量數據庫 (十二)之 文章向量搜索——仙盟創夢IDE

“未來之窗” 文章向量搜索:多領域應用與學習指南 在數字化浪潮中,“未來之窗” 文章向量搜索憑借其獨特的技術優勢,在酒店、電商、診療及知識庫等多個領域展現出巨大的應用潛力,為各行業的信息處理與檢索帶來了全新的視角和高效…

深度剖析:基于反射的.NET二進制序列化器設計與實現

🔍 深度剖析:基于反射的.NET二進制序列化器設計與實現本文將從底層原理到高級優化,全面剖析一個基于反射的.NET二進制序列化器的設計與實現,涵蓋類型系統處理、內存布局、遞歸算法、性能優化等核心主題。1. 設計哲學與架構總覽 1.…

如何在 Ubuntu 上安裝和配置 Samba ?

Samba 是一個開源程序,用于文件共享和網絡打印,使用 SMB 協議。現在基本上用于提供在 Windows 上可訪問的 Linux 文件共享系統。 本文介紹如何在 Ubuntu 上安裝和配置 Samba 服務器,以便跨文件夾共享網絡上不同的計算機。 Update Your Syst…

MATLAB實現CNN-GRU-Attention時序和空間特征結合-融合注意力機制混合神經網絡模型的風速預測

該 MATLAB 代碼實現了一個基于 CNN-GRU-Attention 時序和空間特征結合-融合注意力機制混合神經網絡模型的風速預測。以下是對代碼的簡要分析:一、主要功能 該代碼用于風速時間序列預測,使用歷史風速特征數據(18個特征,75天&#x…

【升級版】從零到一訓練一個 0.6B 的 MoE 大語言模型

前文:從零到一訓練一個 0.6B 的 MoE 大語言模型,本次升級完全重新從零開始重新訓練。主要升級如下: 替換預訓練數據集,使用序列猴子通用文本數據集進行預訓練。使用更先進的訓練方法。新增思考模式控制,可通過添加/th…