一、基本概念
眾所周知,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();
}
程式顯示

三、總結
這種模式的優點在于可以只通過引數即可完成對任意子類物件的呼叫,而且便于擴展,缺點也很明顯,如果要增加一個類,那我必須要更改工廠類才能完成,違反開閉原則(一個軟體物體應當對擴展開放,對修改封閉),
先這樣寫,后面持續更新,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/211131.html
標籤:python
