.NET簡(jiǎn)單工廠模式講解
簡(jiǎn)單工廠模式介紹:
簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種GOF設(shè)計(jì)模式之一。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)。
結(jié)構(gòu)模式圖:
角色分類:
工廠(Creator)角色
簡(jiǎn)單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類的創(chuàng)建產(chǎn)品類的方法可以被外界直接調(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í)例。
引入實(shí)際情況:
如果有一個(gè)住戶管理系統(tǒng),里面的住戶類型是可變的,每一種租戶類型的租金計(jì)算公式都存在差異
A類型的住戶租金額=天數(shù)*單價(jià)+績(jī)效*0.005
B類型的住戶租金額=月份*(每月價(jià)格+performance*0.001)
分析:
1. 商店存在共有的計(jì)算方法,這是實(shí)體商店的行為,然而他們的行為的方式不一樣,所有我們抽象商店類,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.IFactroy { public interface Ishop { double Getrent(int days, double dayprice, double performance); } }
2.在抽象了商店之后,我們要對(duì)創(chuàng)建具體產(chǎn)品類,這里就是具體的類型商店,里面實(shí)現(xiàn)該商店的行為方法。創(chuàng)建A類型的商店
using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.product { //A類型的商店的創(chuàng)建 public class Ashop:Ishop { /// <summary> /// /// A類型商店租金額,天數(shù)*單價(jià)+績(jī)效*0.005 /// </summary> /// <param name="days">天數(shù)</param> /// <param name="dayprice">每天單價(jià)</param> /// <param name="performance">日平均績(jī)效</param> /// <returns></returns> public double Getrent(int days, double dayprice, double performance) { Console.WriteLine("A商店的租金算法"); return days * dayprice + performance * 0.01; } } }
3.創(chuàng)建B類型的商店:
using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.product { /// <summary> /// B類型的商店的創(chuàng)建 /// </summary> public class Bshop:Ishop { /// <summary> /// B類型商店的租金=月份*(每月價(jià)格+performance*0.001) /// </summary> /// <param name="month">月數(shù)</param> /// <param name="monthprice">月單價(jià)</param> /// <param name="performance">月平均績(jī)效</param> /// <returns></returns> public double Getrent(int month, double monthprice, double performance) { Console.WriteLine("B商店的租金算法"); return month * (monthprice + performance * 0.001); } } }
4. 在創(chuàng)建號(hào)類型商店并實(shí)現(xiàn)方法后,思考在什么情況下如何創(chuàng)建那種對(duì)象,于是簡(jiǎn)單工廠模式中最核心的部分:工廠類出來(lái)了
using SimpleFactory.App.IFactroy; using SimpleFactory.App.product; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App.factoryMethod { public class factorymethod { public Ishop CreateShow(string show) { switch (show.Trim().ToLower()) { case"ashop": return new Ashop(); case "bshop": return new Ashop(); default: throw new Exception("該商店不存在"); } } } }
5.然后就根據(jù)當(dāng)前的商店類型進(jìn)行判斷,該類型的商店應(yīng)該進(jìn)行哪一種算法:
using SimpleFactory.App.factoryMethod; using SimpleFactory.App.IFactroy; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SimpleFactory.App { class Program { static void Main(string[] args) { Ishop As; factorymethod afm = new factorymethod(); As = afm.CreateShow("ashop"); //a 類型的某商店 double total = As.Getrent(30, 300, 2000); //30 天/100元 日平均績(jī)效為2000 Console.WriteLine("該A類型商店的租金為:" + total); Console.WriteLine("============="); Ishop Bs; factorymethod bfm = new factorymethod(); Bs = bfm.CreateShow("bshop"); //b 類型的某商店 total = Bs.Getrent(3, 3000, 60000); //3 月/4000元 月平均績(jī)效為60000 Console.WriteLine("該B類型商店的租金為:" + total); Console.ReadKey(); } } }
到這里我們實(shí)現(xiàn)了客戶要求的兩種類型商店的算法的需求,但是作為一種好的設(shè)計(jì)架構(gòu),還應(yīng)該考慮到后面的需求變革,如果客戶現(xiàn)在又增加了C類型商店和D類型商店,它們的算法要求又不一樣,這個(gè)時(shí)候我們就需要進(jìn)行C,D類型商店的創(chuàng)建,并繼承Ishop接口,實(shí)現(xiàn)里面的方法,同時(shí)還得繼續(xù)修改工廠類在switc中增加case進(jìn)行捕捉創(chuàng)建相應(yīng)的商店對(duì)象,一旦出現(xiàn)這樣的情況,是不利于程序的擴(kuò)展性和項(xiàng)目后期的維護(hù)性的。
優(yōu)點(diǎn):
- 簡(jiǎn)單工廠模式能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象。通過(guò)它,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì) 象的尷尬局面中擺脫出來(lái)。
- 外界與具體類隔離開(kāi)來(lái),偶合性低。
- 明確區(qū)分了各自的職責(zé)和權(quán)力,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
缺點(diǎn):
- 工廠類集中了所有實(shí)例的創(chuàng)建邏輯,容易違反GRASPR的高內(nèi)聚的責(zé)任分配原則
- 雖然簡(jiǎn)單工廠模式能夠適應(yīng)一定的變化,但是它所能解決的問(wèn)題是遠(yuǎn)遠(yuǎn)有限的。它所能創(chuàng)建的類只能是事先教考慮到的,如果需要添加新的類,則就需要改變工廠類了。
出現(xiàn)的上訴情況,應(yīng)該如何解決,值得思考,將在下一個(gè)工廠方法模式中得到很好的解決。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺析.net簡(jiǎn)單工廠模式
- asp.net 簡(jiǎn)單工廠模式和工廠方法模式之論述
- JS面向?qū)ο蠡A(chǔ)講解(工廠模式、構(gòu)造函數(shù)模式、原型模式、混合模式、動(dòng)態(tài)原型模式)
- Android源碼學(xué)習(xí)之工廠方法模式應(yīng)用及優(yōu)勢(shì)介紹
- 深入c#工廠模式的詳解
- PHP 工廠模式使用方法
- javascript 模式設(shè)計(jì)之工廠模式學(xué)習(xí)心得
- C++設(shè)計(jì)模式之簡(jiǎn)單工廠模式實(shí)例
- JavaScript 模式之工廠模式(Factory)應(yīng)用介紹
- .NET工廠方法模式講解
相關(guān)文章
時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7的方法
這篇文章主要介紹了時(shí)間輕松學(xué)會(huì).NET Core操作ElasticSearch7,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04運(yùn)用.net core中實(shí)例講解RabbitMQ
RabbitMQ是實(shí)現(xiàn)了高級(jí)消息隊(duì)列協(xié)議(AMQP)的開(kāi)源消息代理軟件(亦稱面向消息的中間件),本文詳細(xì)講解了RabbitMQ以及運(yùn)用.net core中實(shí)例講解其6中模式,感興趣的小伙伴一起來(lái)學(xué)習(xí)吧2021-09-09未能加載文件或程序集“XXX”或它的某一個(gè)依賴項(xiàng)。試圖加載格式不正確的程序。
如果你將應(yīng)用程序生成x86而不是Any CPU時(shí),在64位操作系統(tǒng)中不會(huì)出錯(cuò)錯(cuò)誤,而在32位操作系統(tǒng)中可能會(huì)出現(xiàn)以下錯(cuò)誤2012-11-11ASP.NET Core中的響應(yīng)壓縮的實(shí)現(xiàn)
這篇文章主要介紹了ASP.NET Core中的響應(yīng)壓縮的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08.Net Compact Framework開(kāi)發(fā)小技巧 推薦
這篇文章對(duì)于.Net Compact Framework開(kāi)發(fā)的朋友有一定的幫助,內(nèi)容比較實(shí)用。2009-02-02基于ASP.NET實(shí)現(xiàn)驗(yàn)證碼生成詳解
這篇文章主要為大家詳細(xì)介紹了如何利用ASP.NET實(shí)現(xiàn)驗(yàn)證碼的生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03.NET實(shí)現(xiàn)在網(wǎng)頁(yè)中預(yù)覽Office文件的3個(gè)方法
這篇文章主要介紹了.NET實(shí)現(xiàn)在網(wǎng)頁(yè)中預(yù)覽Office文件的3個(gè)方法,本文最終采用了ASPOSE+pdf2swf+FlexPaper的方式解決了這個(gè)需求,需要的朋友可以參考下2014-10-10Asp.net MVC利用knockoutjs實(shí)現(xiàn)登陸并記錄用戶的內(nèi)外網(wǎng)IP及所在城市(推薦)
這篇文章主要介紹了 Asp.net MVC利用knockoutjs實(shí)現(xiàn)登陸并記錄用戶的內(nèi)外網(wǎng)IP及所在城市(推薦),需要的朋友可以參考下2017-02-02