C# —— 簡單工廠設計模式詳述

一、基本概念

眾所周知,C#是一種面向對象的語言,而其中封裝,繼承,多態是面向對象的三大重要特征,簡單工廠的設計模式則可以完全體現這些特征。要徹底理解這個模式,必須要先將封裝(訪問修飾符的應用)、繼承(基類和派生類的概念)、多態(重載,虛方法,重寫,抽象方法的概念)全部搞懂,并能靈活運用。

1.簡單工廠模式定義

簡單工廠模式簡單來說就是創建一個工廠類,通過輸入的參數創建對象賦值給基類,完成對想要的派生類的調用,從而達成目標,具體的操作均在子類中完成,工廠類只負責運算邏輯和給基類賦值。該模式有三部分:
1、工廠類:實現創建所有實例的選擇類型,被外界調用的接口。
2、抽象類:所要創建的類的基類,描述類所有實例所共有的公共接口(方法),可以是抽象類也可是接口類型(interface),本例是抽象類。
3、具體類:所有要創建的具體實例對象。
為什么要用簡單工廠模式來做呢?按照我的理解,原因如下:
通常需要面對的對象會有很多,這就會有很多類產生,而要調用類的對象需要對類進行實例化,大家想一下,如果每個類都在主函數內進行實例化,那需要寫很多的代碼,所以需要通過多態的方法來實現,另外通過工廠類的方法完成對子類對象的實例化,也就是給基類賦值,從而調用子類方法。

二、舉例

比如去吃飯的時候,你想問某個飯還有多長時間做好,還想了解下菜譜,可供選擇的類型有很多,像黃燜雞米飯,河南燴面,餃子等等,那如果想“隨便”喊一個飯的名稱就能得到回答,就需要通過工廠模式實現。
首先,要先創建一個抽象類,將所有的飯的類型統稱為"Food",類里面創建一個或多個抽象方法。注意,如果基類為抽象類,子類必須重寫,這也是為什么創建抽象基類的原因,可以任意在子類方法里上面實現想要的效果。

    public abstract class Food{public abstract void Ask();public abstract void Menu();}

然后,創建所有的子類,具體到每個飯。

public class Rice : Food{public override void Ask(){Console.WriteLine("黃燜雞米飯正在制作中,還需1分鐘");}public override void Menu(){Console.WriteLine("雞,米,油,鹽,醬油,海帶絲,香菇,辣椒");}}public class Noodles: Food{public override void Ask(){Console.WriteLine("河南燴面正在制作中,還需1小時");}public override void Menu(){Console.WriteLine("面,羊肉湯,蔥花,鹽");}}public class Dumplings : Food{public override void Ask(){Console.WriteLine("餃子正在制作中,還需1天");}public override void Menu(){Console.WriteLine("韭菜,雞蛋,油,鹽");}}

然后,核心的部分來了,創建工廠類要實施的方法,其格式為:訪問修飾符+靜態關鍵字+基類名+方法名(參數名),這樣就可以實現子類給基類賦值的功能。

       //簡單工廠的核心,根據用戶的輸入創建對象賦值給父類public static class 老高飯莊{public static Food Cook(string Foodname){Food f = null;switch (Foodname){case "黃燜雞米飯":f = new Rice();break;case "河南燴面":f = new Noodles();break;case "韭菜雞蛋餃子":f = new Dumplings();break;default:break;}return f;}}

最后,在主函數中對工廠類實例化,我們可以看到,通過工廠類可以實現對任意子類的調用。

 static void Main(string[] args){Console.WriteLine("請輸入菜名:");string Foodname = Console.ReadLine();Food f = 老高飯莊.Cook(Foodname);f.Ask();f.Menu();Console.ReadKey();}

程序顯示
在這里插入圖片描述

三、總結

這種模式的優點在于可以只通過參數即可完成對任意子類對象的調用,而且便于擴展。缺點也很明顯,如果要增加一個類,那我必須要更改工廠類才能完成,違反開閉原則(一個軟件實體應當對擴展開放,對修改封閉)。
先這樣寫,后面持續更新。

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

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

相關文章

【計算機視覺】計算機視覺、模式識別、機器學習常用牛人主頁鏈接

計算機視覺、模式識別、機器學習常用牛人主頁鏈接 牛人主頁(主頁有很多論文代碼) Serge Belongie at UC San DiegoAntonio Torralba at MITAlexei Ffros at CMUCe Liu at Microsoft Research New EnglandVittorio Ferrari at Univ.of EdinburghKristen G…

C# 中的 ConfigurationManager類引用方法

c#添加了Configuration;后,竟然找不到 ConfigurationManager 這個類,后來才發現:雖然引用了using System.Configuration;這個包,但是還是不行的。 后來終于找到一個解決方法,就是在解決方案資源管理器里找到類文件選擇…

機器學習——支持向量機SVM之python實現簡單實例一(含數據預處理、交叉驗證、參數優化等)

目錄 一、SVM理論 二、numpy的相關函數介紹 三、python實現之準備 1、數據集的下載

工業相機常用類型詳述

一、工業相機定義 工業相機是應用于工業領域、安防和交通等對相機要求較高領域的攝像機,功能就是將光信號轉變成有序的電信號,此信號經過模數轉換為數字信號,然后傳遞給圖像處理器。與一般的家用相機相比,其具有更高的穩定性能&a…

機器學習——SVM之python實現數據樣本標準化和歸一化

目錄 一、標準化和歸一化的目的 1、標準化 2、歸一化 二、標準化和歸一化常用的理論公式 1、歸一化 2、標準化 三、python實現SVM樣本數據標準化和歸一化 1、標準化 2、歸一化 本文源代碼:《機器學習——支持向量機SVM之python實現簡單實例一》 一、標準化…

[黑群暉經典教程] 一步一步建立自己的黑群暉

【申明:本文并非本人所作,為內部網絡中一位大神所寫,個人覺得寫得很好,遂原文搬了過來,如有侵犯原作者的權利,請及時與我聯系】 PS:有好幾個兄弟覺得我擅自轉發,不是很妥。解釋一下:…

Java為什么能跨平臺運行

因為java程序編譯之后的代碼不是能被硬件系統直接運行的代碼,而是一種“中間碼”--字節碼。不同的硬件平臺上裝有不同的java虛擬機(JVM),由JVM來把字節碼再翻譯成所對應的硬件平臺能夠執行的代碼,因此java可以跨平臺運…

C++和Opencv4.5 實現全景圖像拼接

前言 最近剛下了最新版的opencv4.5,急不可待的試下操作,就用了opencv自帶的Stitcher類拼接下圖像,結果傻眼了,程序顯示Stitcher沒有createDefault成員,看了好久,終于找到了解決方法。 Stitcher原理 Stit…

機器學習——python實現SVM模型w,b的查看

基于源代碼:《機器學習——支持向量機SVM之python實現簡單實例一》進行講解 1、線性模型 這里以二特征三類,一對多策略為案例 kernel “linear”:線性核,參數有w,b 線性模型的決策邊界是:w0iTx0i w1i…

Codeforces-712C-Memory and De-Evolution

轉載于:https://www.cnblogs.com/GrowingJlx/p/6642764.html

移動端輸入框彈出鍵盤控制

在移動端,我們公司通過輸入框主要收集用戶的姓名和電話,以下是對輸入框獲取焦點時,控制彈出鍵盤的樣式來增強用戶體驗。 輸入姓名 我們的用戶都是中國人,輸入用戶名為中文,所以彈出鍵盤是輸入中文狀態即可,…

Opencv4.5-C++ 攝像頭畫面鏡像顯示及文件保存

前言 想試下新買電腦的攝像頭好用不&#xff0c;就寫了個攝像頭調用程序&#xff0c;實現了鏡像和圖片截取保存。 代碼 #include <iostream> #include <opencv2/stitching.hpp> #include <opencv2\opencv.hpp> #include <opencv2/highgui/highgui.h…

機器學習之支持向量機SVM之python實現ROC曲線繪制(二分類和多分類)

目錄 一、ROC曲線 二、TP、FP、TN、FN 三、 python繪制ROC曲線(二分類) 1、思路 2、關鍵代碼

easyui datagrid 列拖動

實現代碼-code <script type"text/javascript"> $.extend($.fn.datagrid.methods, { columnMoving: function(jq) { return jq.each(function() { var target this; var cells $(this).datagrid(getPanel).find(div.datagrid-header td[field]); cells.dragg…

window linux IPC ftok BY_HANDLE_FILE_INFORMATION

看這題目就很亂&#xff0c;心情當然也是不怎么美好了。前一段時間做了一個項目&#xff0c;AIX(Unix的一種&#xff09;中的一個系統向WINDOWS移植&#xff0c;開發環境由IBM的C/C(叫什么忘記了&#xff0c;好像是xlC)變為VC。 這是算過來&#xff0c;但是最近進程通信的信號量…

相機標定(一) —— 深入理解齊次坐標及其作用

一、什么是齊次坐標和齊次坐標系 齊次坐標 齊次坐標是一個相機標定問題的關鍵理論之一&#xff0c;所以就此問題分析一下。 單從定義上來講&#xff0c;齊次坐標&#xff08;投影坐標&#xff09;就是用N1維來代表N維坐標&#xff08;點和向量&#xff09;&#xff0c;也可說…

機器學習——圖解SVM中gamma和c參數的作用

參數c和gamma的作用 我們通過下圖詳解參數c的作用&#xff0c;首先我們以一個簡單的線性分類器為例&#xff0c;上一個博客中我們知道影響分類器的主要因素是支持向量&#xff0c;即虛線上的樣本&#xff0c;如下圖可知&#xff1a; 但當正負樣本的分布在如下情況時&#xff0…

關于結構體里面結構體的申明和使用

申請&#xff1a; typedef struct Vo{int Voltage;float Delay_ms;char Enable;}Volt_Def;typedef struct ed{float Delay_ms;int Level;}Edge_Def;typedef struct Ed_hard{Edge_Def a;Edge_Def b;Edge_Def c;}HARD_RESET;int power_sel 0xff;typedef struct power_x{Volt_Def…

面試題(十四)

唐巧前輩說這些都是 iOS 的基礎問題&#xff0c;應該對此深入的了解。當初看到時&#xff0c;大部分回答不上來&#xff0c;因為平時沒有好好思考整理過。這里大部分的概念大多會在學習 OC 的過程中遇到過&#xff0c;但還是得經過寫代碼才能有更深的理解。反正我當初看那些設計…

工業相機基礎知識詳述 —— 焦平面,像平面,彌散圓,光圈,分辨率,景深,接口,靶面尺寸

一、焦平面 想到焦平面&#xff0c;很多人不由自主就想到不就是焦點所在的垂直于光軸的平面嗎&#xff1f;其實其背后隱藏這更多的東西。 1&#xff09;焦點不止一個 對于一般拍攝場景來說&#xff0c;光通過一個凸透鏡&#xff0c;匯聚不到一個點&#xff0c;越靠近中軸線的…