回顧下設(shè)計(jì)模式系列《工廠模式》那片文章,里面描述了如何利用工廠模式來(lái)模擬一個(gè)換燈泡的場(chǎng)景,該場(chǎng)景中模擬了:普通燈泡、節(jié)能燈泡、彩色燈泡。它們統(tǒng)一由一個(gè)工廠(工廠類)來(lái)創(chuàng)造,我們需要使用哪種燈泡時(shí),只需通知工廠類給我們打造一個(gè)相同的燈泡即可,類圖如下:
創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元蘇家屯做網(wǎng)站,已為上家服務(wù),為蘇家屯各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575
由上面邊的類圖可見(jiàn),所有類型的燈泡都由燈泡工廠來(lái)創(chuàng)建,那這個(gè)時(shí)候,制造燈泡的工廠因?yàn)槠髽I(yè)擴(kuò)大了,需要增加產(chǎn)量,那么此時(shí)一個(gè)工廠肯定是應(yīng)付不過(guò)來(lái)了,而且當(dāng)前一個(gè)工廠所造的燈泡種類也多,更加加大了工廠的制造壓力,此時(shí),企業(yè)擴(kuò)建的最好辦法就是,增加工廠,各自工廠都只專注于一種燈泡的制造。
1.工廠方法模式
首先我們來(lái)看看什么是工廠方法模式:定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。
工廠方法模式類圖如下:
Product:定義工廠方法所創(chuàng)建的對(duì)象的接口。相當(dāng)于上邊場(chǎng)景中的燈泡抽象。
ConcreteProduct:具體實(shí)現(xiàn)Product抽象的具體產(chǎn)品類。相當(dāng)于上邊場(chǎng)景中的具體燈泡。
Creator:聲明工廠方法,該方法返回一個(gè)Product類型的對(duì)象。
ConcreteCreator:重定義工廠方法返回一個(gè)ConcreteProduct實(shí)例。
可能這會(huì)大家看完這個(gè)類圖會(huì)有點(diǎn)模糊,不過(guò)沒(méi)關(guān)系,接下來(lái)我們利用工廠方法模式來(lái)實(shí)現(xiàn)我們上邊的場(chǎng)景(企業(yè)擴(kuò)大需要建立更多的工廠)。
首先,企業(yè)擴(kuò)大了,需要增加產(chǎn)量建立更多的工廠來(lái)創(chuàng)建,為了更好的提高生產(chǎn)效率,每個(gè)工廠只專注于生產(chǎn)一種種類的燈泡,利用工廠方法模式設(shè)計(jì)的類圖如下:
邊分析邊實(shí)現(xiàn)代碼:
第一步,工廠擴(kuò)大了,所造的產(chǎn)品還是燈泡,所以我們還是要把燈泡先抽象出來(lái),為何要抽象請(qǐng)參考《工廠模式》這篇文章。
- //燈泡的約定
- public interface IBulb
- {
- //統(tǒng)一的發(fā)光接口
- public void Luminescence();
- }
第二步,還是實(shí)現(xiàn)目前所有種類的具體燈泡類型。代碼如下:
- //燈泡
- public class Bulb : IBulb//實(shí)現(xiàn)了燈泡的約定、標(biāo)準(zhǔn) {
- //發(fā)光
- public void Luminescence()
- {
- //燈泡發(fā)光的實(shí)現(xiàn)
- }
- }
- //節(jié)能燈泡
- public class FrugalBulb : IBulb //實(shí)現(xiàn)了燈泡的約定、標(biāo)準(zhǔn)
- {
- //節(jié)能發(fā)光
- public void Luminescence()
- {
- //節(jié)能燈泡發(fā)光的實(shí)現(xiàn)
- }
- }
- //彩色燈泡
- public class ColorBulb : IBulb
- {
- //彩色發(fā)光
- public void Luminescence()
- {
- //彩色燈泡發(fā)光的實(shí)現(xiàn)
- }
- }
- //工廠的抽象
- public interface IMyBulbFactory
- {
- IBulb GetBulb();//將來(lái)每個(gè)工廠都有制造燈泡的行為
- }
第四步,實(shí)現(xiàn)制造每個(gè)種類燈泡的具體工廠,每個(gè)工廠都只制造自己所造種類的燈泡,代碼如下:
- //制造普通燈泡的工廠
- public class BulbFactory : IMyBulbFactory
- {
- //該工廠制造燈泡的行為 只能制造普通燈泡
- public IBulb GetBulb()
- {
- return new Bulb();
- }
- }
- //制造節(jié)能燈泡的工廠
- public class FrugalBulbFactroy : IMyBulbFactory
- {
- //該工廠制造燈泡的行為 只能制造節(jié)能燈泡
- public IBulb GetBulb()
- {
- return new FrugalBulb();
- }
- }
- //制造節(jié)能燈泡的工廠
- public class ColorBulbFactroy : IMyBulbFactory
- {
- //該工廠制造燈泡的行為 只能制造彩色燈泡
- public IBulb GetBulb()
- {
- return new ColorBulb();
- }
- }
- static void Main(string[] args)
- {
- //需要普通燈泡
- IMyBulbFactory bulbFactory = new BulbFactory();
- IBulb bulb = bulbFactory.GetBulb();
- bulb.Luminescence(); //普通燈泡發(fā)光
- //需要節(jié)能燈泡
- IMyBulbFactory frugalBulbFactroy = new FrugalBulbFactroy();
- IBulb frugalBulb = frugalBulbFactroy.GetBulb();
- frugalBulb.Luminescence(); //節(jié)能燈泡發(fā)光
- //需要彩色燈泡
- IMyBulbFactory colorbulbFacroty = new ColorBulbFactroy();
- IBulb colorBulb = colorbulbFacroty.GetBulb();
- colorBulb.Luminescence(); //彩色燈泡發(fā)光
- }
2.使用反射的工廠方法模式
那么如何接觸上邊的耦合度呢?可以通過(guò)C#的反射機(jī)制,將當(dāng)前所有工廠都配置到配置文件中,然后在配置一個(gè)當(dāng)前需要使用的工廠節(jié)點(diǎn),配置文件如下:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <appSettings>
- <!--配置所有現(xiàn)有的工廠-->
- <add key="bulbFactory" value="設(shè)計(jì)模式系列.工廠方法模式.BulbFactory"></add>
- <add key="frugalBulbFactory" value="設(shè)計(jì)模式系列.工廠方法模式.FrugalBulbFactroy"></add>
- <add key="ColorBulbFactory" value="設(shè)計(jì)模式系列.工廠方法模式.ColorBulbFactroy"></add>
- <!--配置當(dāng)前使用的工廠 當(dāng)前使用普通燈泡的工廠 value="bulbFactory"-->
- <add key="NonFactory" value="bulbFactory"></add>
- </appSettings>
- </configuration>
這是我們還需要封裝一個(gè)專門提供具體工廠的類,為了方便這個(gè)類我就不考慮耦合了度。代碼如下:
- //用來(lái)提供當(dāng)前需要使用的工廠 當(dāng)前使用的工廠在配置文件中nonfactoty節(jié)點(diǎn)中配置
- public class FactroyProvider
- {
- public static IMyBulbFactory WhereToFactroy()
- {
- string fName = string.Empty;
- string factoryName = string.Empty;
- IMyBulbFactory factory = null;
- if(!string.IsNullOrEmpty(ConfigurationManager.AppSettings["NonFactory"]))
- {
- factoryName = ConfigurationManager.AppSettings["NonFactory"];
- if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings[factoryName]))
- {
- fName = ConfigurationManager.AppSettings[factoryName];
- factory = Assembly.Load("設(shè)計(jì)模式系列").CreateInstance(fName) as IMyBulbFactory;
- }
- }
- return factory;
- }
- }
3.工廠方法模式與工廠模式的區(qū)別
說(shuō)道這里,不知道大家會(huì)不會(huì)有一個(gè)疑問(wèn),總之剛開(kāi)始我是有這個(gè)疑問(wèn),疑問(wèn)就是它和工廠模式的區(qū)別是什么呢?
首先我們回顧下《工廠模式》中的工廠類的代碼,代碼如下:
- public class MyBulbFactory
- {
- public static IBulb GetBulb(string bulbName)
- {
- IBulb bulb = null;
- //告訴我你要什么燈泡,我制造相應(yīng)的燈泡給你
- switch (bulbName)
- {
- case "bulb":
- bulb = new Bulb();
- break;
- case "frugalbulb":
- bulb = new FrugalBulb();
- break;
- case "colorbulb":
- bulb = new ColorBulb();
- break;
- }
- return bulb;
- }
- }
- //需要普通燈泡
- IMyBulbFactory bulbFactory = new BulbFactory();//這里就制定了具體的工廠類
- IBulb bulb = bulbFactory.GetBulb();
- bulb.Luminescence(); //普通燈泡發(fā)光
這樣就增加了耦合性。我們?cè)谏厦媸褂昧朔瓷漕惤獬笋詈希怯忠粋€(gè)疑問(wèn)出來(lái)啦,那么簡(jiǎn)單工廠模式在創(chuàng)建產(chǎn)品類的時(shí)候,如果也使用反射的話那么將來(lái)在新增產(chǎn)品的時(shí)候也就不需要修改工廠類的代碼了,也就是說(shuō)簡(jiǎn)單工廠模式使用反射一樣可以完美的解決開(kāi)放封閉原則的問(wèn)題!
那么新的問(wèn)題又出來(lái)了,那簡(jiǎn)單工廠模式還有什么作用呢?
我個(gè)人有兩種理解的方式,僅代表個(gè)人觀點(diǎn),也希望大家都詳細(xì)的說(shuō)說(shuō)自己的觀點(diǎn),不要一句話概括噢~!
第一種、在早期設(shè)計(jì)模式應(yīng)用的時(shí)候,編程語(yǔ)言還沒(méi)有使用反射的機(jī)制時(shí),使用工廠方法模式來(lái)升級(jí)簡(jiǎn)單工廠模式,使能夠支持開(kāi)放封閉原則。
第二種、在特殊場(chǎng)景中,工廠方法模式能更好的實(shí)現(xiàn)邏輯的組織,例如本篇文章所使用的場(chǎng)景。
本文題目:設(shè)計(jì)模式系列-工廠方法模式
URL鏈接:http://muchs.cn/article36/pdgcsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)公司、品牌網(wǎng)站建設(shè)、微信小程序、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)