C#設(shè)計(jì)模式之簡(jiǎn)單工廠模式
設(shè)計(jì)模式分類(lèi):
- 創(chuàng)建型模式。
- 結(jié)構(gòu)型模式。
- 行為模式。
23種設(shè)計(jì)模式,如何記。面向?qū)ο蟮南到y(tǒng)中有很多對(duì)象,創(chuàng)建型模式解決的問(wèn)題就是如何創(chuàng)建對(duì)象,何時(shí)創(chuàng)建對(duì)象,它努力的讓代碼不要太多的關(guān)注對(duì)象的具體類(lèi)型,不用關(guān)注對(duì)象的創(chuàng)建細(xì)節(jié),而知需要了解對(duì)象的抽象類(lèi)型,創(chuàng)建對(duì)象的工作由創(chuàng)建對(duì)象的工廠來(lái)實(shí)現(xiàn)。
面向?qū)ο蟮南到y(tǒng)中,對(duì)象如何組織,采用什么樣的結(jié)構(gòu)組織比較合理,這個(gè)是由結(jié)構(gòu)型模式來(lái)處理的。合理的使用結(jié)構(gòu)型模式可以使系統(tǒng)具備更好的靈活性、擴(kuò)展性和維護(hù)性。
行為模式規(guī)定了各個(gè)對(duì)象間的應(yīng)該具備的職責(zé)。
嚴(yán)格來(lái)說(shuō),簡(jiǎn)單工廠模式并不是23種標(biāo)準(zhǔn)模式之一,它是工廠家族中最簡(jiǎn)單的模式,使用這個(gè)模式可以把對(duì)象的創(chuàng)建和對(duì)象的使用分離開(kāi),工廠只負(fù)責(zé)對(duì)象的創(chuàng)建,客戶(hù)端程序調(diào)用和使用對(duì)象,客戶(hù)端程序無(wú)需創(chuàng)建對(duì)象。這樣對(duì)象的創(chuàng)建放在一起,方便維護(hù)和擴(kuò)展?,F(xiàn)實(shí)中生產(chǎn)鞋子的工廠負(fù)責(zé)生產(chǎn)鞋子,我們不需要知道生產(chǎn)的鞋子的具體類(lèi)型。
如圖所示:右上角是一個(gè)產(chǎn)品接口,我們可以使用接口或抽象類(lèi)來(lái)定義一個(gè)產(chǎn)品對(duì)象。Animal類(lèi)中有一個(gè)行為吃,Animal類(lèi)派生出兩個(gè)子類(lèi):Dog、Penguin。這兩個(gè)類(lèi)分別實(shí)現(xiàn)了吃的動(dòng)作,這兩個(gè)動(dòng)物其實(shí)是簡(jiǎn)單工廠中具體的產(chǎn)品,通過(guò)他們實(shí)現(xiàn)抽象的產(chǎn)品;這些動(dòng)物該如何去創(chuàng)建呢,我們可以用動(dòng)物工廠AnimalFactory來(lái)創(chuàng)建具體的動(dòng)物,AnimalFactory類(lèi)中有一個(gè)GetAnimal的方法,在這個(gè)方法里我們可以根據(jù)傳進(jìn)去的參數(shù)來(lái)創(chuàng)建具體的產(chǎn)品,工廠類(lèi)和產(chǎn)品類(lèi)是依賴(lài)的關(guān)系。
在客戶(hù)端,它關(guān)聯(lián)了抽象的產(chǎn)品類(lèi)Animal和工廠類(lèi)AnimalFactory,對(duì)客戶(hù)來(lái)說(shuō),他不需要了解具體的產(chǎn)品,只需要告訴工廠,需要什么具體的動(dòng)物,動(dòng)物工廠就會(huì)根據(jù)客戶(hù)端的要求來(lái)創(chuàng)建某個(gè)動(dòng)物,通過(guò)簡(jiǎn)單工廠模式,使客戶(hù)端程序與具體的產(chǎn)品之間減少耦合度。
示例:
抽象動(dòng)物類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /* 動(dòng)物抽象類(lèi) * 抽象產(chǎn)品 */ public abstract class Animal { public abstract void Eat(); } }
具體動(dòng)物狗類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /* 具體的產(chǎn)品類(lèi),實(shí)現(xiàn)抽象產(chǎn)品類(lèi) */ public class Dog:Animal { // 實(shí)現(xiàn)抽象方法 public override void Eat() { Console.WriteLine("狗在吃飯!"); } } }
具體動(dòng)物企鵝類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /* 具體產(chǎn)品類(lèi),實(shí)現(xiàn)抽象產(chǎn)品類(lèi) */ public class Penguin :Animal { // 實(shí)現(xiàn)抽象方法 public override void Eat() { Console.WriteLine("企鵝在吃飯!"); } } }
動(dòng)物工廠類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /* 動(dòng)物工廠類(lèi):實(shí)現(xiàn)具體的動(dòng)物 */ public class AnimalFactory { /// <summary> /// 根據(jù)客戶(hù)的選擇創(chuàng)建動(dòng)物對(duì)象 /// </summary> /// <param name="witch">動(dòng)物編號(hào)</param> /// <returns></returns> public Animal GetAnimal(int witch) { Animal am = null; switch (witch) { case 1: am = new Dog(); break; case 2: am = new Penguin(); break; } return am; } } }
主程序調(diào)用測(cè)試
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { class Program { static void Main(string[] args) { // 得到具體的動(dòng)物 (里氏替換原則) Animal am = new AnimalFactory().GetAnimal(1); // 調(diào)用Eat()方法 am.Eat(); // 輸出狗在吃飯 Console.ReadKey(); } } }
測(cè)試結(jié)果:
使用接口實(shí)現(xiàn)簡(jiǎn)單工廠模式
需求:使用面向?qū)ο蟮姆绞皆O(shè)計(jì)一個(gè)系統(tǒng),描述使用卡車(chē)從事貨運(yùn),使用公共汽車(chē)從事客運(yùn)。使用工廠模式實(shí)現(xiàn)。
1、汽車(chē)接口:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /// <summary> /// 汽車(chē)接口 /// </summary> public interface ICar { /// <summary> /// 描述汽車(chē)從事的活動(dòng) /// </summary> void Work(); } }
2、分別定義卡車(chē)類(lèi)(Truck)和公共汽車(chē)類(lèi)(Bus)實(shí)現(xiàn)ICar接口
Truck類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /// <summary> /// 卡車(chē)類(lèi) /// </summary> public class Truck : ICar { /// <summary> /// 卡車(chē)從事的活動(dòng) /// </summary> public void Work() { Console.WriteLine("卡車(chē)從事貨運(yùn)"); } } }
Bus類(lèi):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /// <summary> /// 公共汽車(chē)類(lèi) /// </summary> public class Bus:ICar { /// <summary> /// 公共汽車(chē)從事的活動(dòng) /// </summary> public void Work() { Console.WriteLine("公共汽車(chē)從事客運(yùn)"); } } }
3、定義汽車(chē)的工廠類(lèi)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { /// <summary> /// 汽車(chē)工廠類(lèi):返回具體的汽車(chē)類(lèi) /// </summary> public class CarFactory { /// <summary> /// 根據(jù)汽車(chē)編號(hào)創(chuàng)建具體的汽車(chē)對(duì)象 /// </summary> /// <param name="witch">汽車(chē)編號(hào)</param> /// <returns></returns> public ICar GetCar(int witch) { ICar car = null; switch (witch) { case 1: car= new Truck(); break; case 2: car = new Bus(); break; } return car; } } }
4、主程序調(diào)用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 簡(jiǎn)單工廠模式 { class Program { static void Main(string[] args) { // 得到具體的汽車(chē) ICar car = new CarFactory().GetCar(2); // 調(diào)用Work()方法 car.Work(); Console.ReadKey(); } } }
5、程序運(yùn)行結(jié)果
簡(jiǎn)單工廠模式的缺點(diǎn):
增加具體產(chǎn)品時(shí),需要修改工廠類(lèi)里面生成具體產(chǎn)品的方法,這就違反了開(kāi)閉原則。具體產(chǎn)品經(jīng)常發(fā)生變化時(shí),不建議使用簡(jiǎn)單工廠模式。
代碼下載地址:點(diǎn)擊下載
到此這篇關(guān)于C#設(shè)計(jì)模式之簡(jiǎn)單工廠模式的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中字符串與字節(jié)數(shù)組的轉(zhuǎn)換方式
這篇文章介紹了C#中字符串與字節(jié)數(shù)組的轉(zhuǎn)換方式,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#正則匹配RegexOptions選項(xiàng)的組合使用方法
本文主要簡(jiǎn)單介紹RegexOptions各種選項(xiàng)的作用,并介紹如何組合使用,為初學(xué)者解除一些疑惑。2016-04-04C#自定義RSA加密解密及RSA簽名和驗(yàn)證類(lèi)實(shí)例
這篇文章主要介紹了C#自定義RSA加密解密及RSA簽名和驗(yàn)證類(lèi),實(shí)例分析了C#實(shí)現(xiàn)RSA加密解密及RSA簽名和驗(yàn)證的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03C#在foreach遍歷刪除集合中元素的三種實(shí)現(xiàn)方法
這篇文章主要給大家總結(jié)介紹了關(guān)于C#在foreach遍歷刪除集合中元素的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12c#創(chuàng)建圓形類(lèi)Circle、矩形類(lèi)實(shí)現(xiàn)代碼
這篇文章主要介紹了c#創(chuàng)建圓形類(lèi)Circle實(shí)現(xiàn)代碼,其中包括set,get方法,需要的朋友可以參考下2020-11-11C#使用InstallerProjects打包桌面應(yīng)用程序的完整步驟
這篇文章主要給大家介紹了關(guān)于C#使用InstallerProjects打包桌面應(yīng)用程序的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07.NET(C#):Emit創(chuàng)建異常處理的方法
.NET(C#):Emit創(chuàng)建異常處理的方法,需要的朋友可以參考一下2013-04-04c# WPF如何實(shí)現(xiàn)滾動(dòng)顯示的TextBlock
這篇文章主要介紹了c# WPF如何實(shí)現(xiàn)滾動(dòng)顯示的TextBlock,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03