深入了解c# 設(shè)計(jì)模式之簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式,需要說(shuō)明的是,它并不屬于GOF 23種設(shè)計(jì)模式中的一種。但它卻豐富了工廠模式家族,因?yàn)槠浜?jiǎn)單的思想和使用方式,也有很廣泛的使用
簡(jiǎn)單工廠模式又稱為靜態(tài)工廠模式,它用來(lái)確定創(chuàng)建哪一種對(duì)象的實(shí)例。這種模式應(yīng)該說(shuō)是最簡(jiǎn)單最實(shí)用的工廠模式了,它將外界創(chuàng)建對(duì)象的邏輯收集起來(lái),做到了對(duì)外界隔離對(duì)象的創(chuàng)建邏輯的目的,使外面完全的成為了對(duì)象實(shí)例的使用者,明確了職責(zé)。
不過(guò)這種模式也有著非常明顯是的缺點(diǎn),工廠類中集中了所有對(duì)象實(shí)例的創(chuàng)建邏輯,造成了功能的高內(nèi)聚;另外在擴(kuò)展方面,如果需要添加新的類,就需要改變工廠類。隨著系統(tǒng)功能的增多,工廠類也會(huì)變得很臃腫。
使用注意
- 盡量不要用于創(chuàng)建太多的對(duì)象,因?yàn)檫@樣會(huì)把業(yè)務(wù)邏輯變得復(fù)雜,也會(huì)讓系統(tǒng)耦合度變高,很容易造成全局性的影響
- 客戶端只關(guān)心獲取對(duì)象,而不關(guān)心對(duì)象的創(chuàng)建細(xì)節(jié)的時(shí)候
另外簡(jiǎn)單工廠模式與策略者模式在結(jié)構(gòu)上也非常的相似,在某些場(chǎng)景兩者幾乎可以互換。但是需要強(qiáng)調(diào)的是,簡(jiǎn)單工廠模式處理的是對(duì)象的獲取,策略者模式處理的是算法及其行為的抽象。
該模式中包含的角色及其職責(zé)
- 工廠(Factory)角色 :簡(jiǎn)單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象。
- 抽象產(chǎn)品(Product)角色 :簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
- 具體產(chǎn)品(Concrete Product)角色:是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類的實(shí)例。
以下為簡(jiǎn)單工廠的UML類圖
下面將展示一個(gè)簡(jiǎn)單的計(jì)算器列子,使用了抽象類,是因?yàn)槌橄箢惐冉涌诳梢愿玫乇磉_(dá)實(shí)例對(duì)象的內(nèi)容
先來(lái)看一下這個(gè)實(shí)例的類圖,Calulator為計(jì)算器加減乘除的抽象類,目前只提供了一個(gè)方法就是計(jì)算算術(shù)結(jié)果,SimpleFactory類專用于用于生產(chǎn)加減乘除實(shí)例的對(duì)象
以下為具體的代碼
public abstract class Calculator { public abstract int Operate(int a,int b); } public class Minus: Calculator { public override int Operate(int a, int b) { return a- b; } } public class Plus : Calculator { public override int Operate(int a, int b) { return a + b; } } public class Multiply : Calculator { public override int Operate(int a, int b) { return a * b; } } public class Divide : Calculator { public override int Operate(int a, int b) { if(b==0) throw new ArgumentException("除數(shù)不能為0"); return a / b; } }
這里是工廠化處理
public class SimpleFactory { public Calculator GetOperation(string operatorName) { switch (operatorName) { case "Minus": return new Minus(); case "Plus": return new Plus(); case "Multiply": return new Multiply(); case "Divide": return new Divide(); default: throw new Exception("當(dāng)前未提供此計(jì)算方式"); } } }
調(diào)用
class Program { static void Main(string[] args) { SimpleFactory simpleFactory = new SimpleFactory(); Dictionary<string,string> optionsDictionary = new Dictionary<string, string> { { "A","Plus"}, { "B","Minus"}, { "C","Multiply"}, { "D","Divide"}, }; string readOptions = string.Empty; do { foreach (KeyValuePair<string, string> keyValuePair in optionsDictionary) { Console.WriteLine(keyValuePair.Key+"、"+keyValuePair.Value); } Console.WriteLine("請(qǐng)輸入A、B、C、D確定計(jì)算方式"); string option = Console.ReadLine(); if (!optionsDictionary.ContainsKey(option)) { throw new Exception("當(dāng)前未提供此計(jì)算方式"); } Console.WriteLine("請(qǐng)輸入第一個(gè)數(shù)"); int a = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("請(qǐng)輸入第二個(gè)數(shù)"); int b = Convert.ToInt32(Console.ReadLine()); Calculator calculator = simpleFactory.GetOperation(optionsDictionary[option]); Console.WriteLine("當(dāng)前結(jié)果是:"+calculator.Operate(a, b)); Console.WriteLine("繼續(xù)請(qǐng)按Y"); readOptions = Console.ReadLine(); } while (readOptions == "Y"); } }
下面是輸出結(jié)果
A、Plus
B、Minus
C、Multiply
D、Divide
請(qǐng)輸入A、B、C、D確定計(jì)算方式
A
請(qǐng)輸入第一個(gè)數(shù)
1
請(qǐng)輸入第二個(gè)數(shù)
5
當(dāng)前結(jié)果是:6
繼續(xù)請(qǐng)按Y
Y
A、Plus
B、Minus
C、Multiply
D、Divide
請(qǐng)輸入A、B、C、D確定計(jì)算方式
C
請(qǐng)輸入第一個(gè)數(shù)
9
請(qǐng)輸入第二個(gè)數(shù)
2
當(dāng)前結(jié)果是:18
繼續(xù)請(qǐng)按Y
以上就是深入了解c# 設(shè)計(jì)模式之簡(jiǎn)單工廠模式的詳細(xì)內(nèi)容,更多關(guān)于c# 簡(jiǎn)單工廠模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#基礎(chǔ)知識(shí)之GetType與typeof的區(qū)別小結(jié)
在比較對(duì)象時(shí),需要了解他們的類型,才能決定他們的值是否能比較。所有的類都從System.Object中繼承了GetType()方法,常常與typeo()運(yùn)算符一起使用。這篇文章主要給大家介紹了關(guān)于C#基礎(chǔ)知識(shí)之GetType與typeof區(qū)別的相關(guān)資料,需要的朋友可以參考下2021-06-06C#利用win32 Api 修改本地系統(tǒng)時(shí)間、獲取硬盤(pán)序列號(hào)
這篇文章主要介紹了C#利用win32 Api 修改本地系統(tǒng)時(shí)間、獲取硬盤(pán)序列號(hào)的方法及代碼分享,需要的朋友可以參考下2015-03-03C#使用Newtonsoft.Json中的JObject對(duì)象
本文詳細(xì)講解了C#使用Newtonsoft.Json中JObject對(duì)象的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07C#基于winform實(shí)現(xiàn)音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了C#基于winform實(shí)現(xiàn)音樂(lè)播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Unity實(shí)現(xiàn)鼠標(biāo)點(diǎn)2D轉(zhuǎn)3D進(jìn)行旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)鼠標(biāo)點(diǎn)2D轉(zhuǎn)3D進(jìn)行旋轉(zhuǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)無(wú)限級(jí)聯(lián)下拉列表框的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-03-03