C#實(shí)現(xiàn)設(shè)計(jì)模式 —— 抽象工廠模式

本文為轉(zhuǎn)載飒硅,原文C#實(shí)現(xiàn)設(shè)計(jì)模式 —— 抽象工廠模式

介紹

定義

抽象工廠模式(Abstract Factory Pattern):提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無須指定它們具體的類巷波。抽象工廠模式又稱為Kit模式沧竟,屬于對象創(chuàng)建型模式。

模式動(dòng)機(jī)

在工廠方法模式中具體工廠負(fù)責(zé)生產(chǎn)具體的產(chǎn)品,每一個(gè)具體工廠對應(yīng)一種具體產(chǎn)品燃乍,工廠方法也具有唯一性,一般情況下宛琅,一個(gè)具體工廠中只有一個(gè)工廠方法或者一組重載的工廠方法刻蟹。但是有時(shí)候我們需要一個(gè)工廠可以提供多個(gè)產(chǎn)品對象,而不是單一的產(chǎn)品對象嘿辟。
為了更清晰地理解工廠方法模式舆瘪,需要先引入兩個(gè)概念:

  • 產(chǎn)品等級結(jié)構(gòu):產(chǎn)品等級結(jié)構(gòu)即產(chǎn)品的繼承結(jié)構(gòu),如一個(gè)抽象類是電視機(jī)红伦,其子類有海爾電視機(jī)英古、海信電視機(jī)、TCL電視機(jī)昙读,則抽象電視機(jī)與具體品牌的電視機(jī)之間構(gòu)成了一個(gè)產(chǎn)品等級結(jié)構(gòu)召调,抽象電視機(jī)是父類,而具體品牌的電視機(jī)是其子類蛮浑。

  • 產(chǎn)品族:在抽象工廠模式中唠叛,產(chǎn)品族是指由同一個(gè)工廠生產(chǎn)的,位于不同產(chǎn)品等級結(jié)構(gòu)中的一組產(chǎn)品沮稚,如海爾電器工廠生產(chǎn)的海爾電視機(jī)艺沼、海爾電冰箱,海爾電視機(jī)位于電視機(jī)產(chǎn)品等級結(jié)構(gòu)中壮虫,海爾電冰箱位于電冰箱產(chǎn)品等級結(jié)構(gòu)中澳厢。

產(chǎn)品族與產(chǎn)品等級結(jié)構(gòu)示意圖:
[圖片上傳失敗...(image-a5a72a-1514254350084)]

當(dāng)系統(tǒng)所提供的工廠所需生產(chǎn)的具體產(chǎn)品并不是一個(gè)簡單的對象环础,而是多個(gè)位于不同產(chǎn)品等級結(jié)構(gòu)中屬于不同類型的具體產(chǎn)品時(shí)需要使用抽象工廠模式。
抽象工廠模式是所有形式的工廠模式中最為抽象和最具一般性的一種形態(tài)剩拢。
抽象工廠模式與工廠方法模式最大的區(qū)別在于线得,工廠方法模式針對的是一個(gè)產(chǎn)品等級結(jié)構(gòu),而抽象工廠模式則需要面對多個(gè)產(chǎn)品等級結(jié)構(gòu)徐伐,一個(gè)工廠等級結(jié)構(gòu)可以負(fù)責(zé)多個(gè)不同產(chǎn)品等級結(jié)構(gòu)中的產(chǎn)品對象的創(chuàng)建 贯钩。當(dāng)一個(gè)工廠等級結(jié)構(gòu)可以創(chuàng)建出分屬于不同產(chǎn)品等級結(jié)構(gòu)的一個(gè)產(chǎn)品族中的所有對象時(shí),抽象工廠模式比工廠方法模式更為簡單办素、有效率角雷。

模式結(jié)構(gòu)

抽象工廠模式包含如下角色:
抽象工廠(Abstract Factory):聲明生成一系列抽象產(chǎn)品的方法
具體工廠(Concrete Factory):執(zhí)行生成一系列抽象產(chǎn)品的方法,生成一系列具體的產(chǎn)品
抽象產(chǎn)品(Abstract Product):為這一系列的某一種產(chǎn)品聲明接口
具體產(chǎn)品(Product):定義具體工廠生成的具體產(chǎn)品的對象性穿,實(shí)現(xiàn)產(chǎn)品接口
客戶(Client):我們的應(yīng)用程序客戶端(不要理解成人)勺三,使用抽象產(chǎn)品和抽象工廠生成對象。

示例代碼

抽象工廠

public interface ICarFactory
{
    IEngine CreateEngine();
    ISeat CreateSeat();
}

具體工廠:

public class CarAFactory : ICarFactory
{
    public IEngine CreateEngine()
    {
        return new EngineA();
    }

    public ISeat CreateSeat()
    {
        return new SeatA();
    }
}
public class CarBFactory : ICarFactory
{
    public IEngine CreateEngine()
    {
        return new EngineB();
    }

    public ISeat CreateSeat()
    {
        return new SeatB();
    }
}

抽象產(chǎn)品:

public interface IEngine
{
    void Run();
}
public interface ISeat
{
    void Message();
}

具體產(chǎn)品:

public class EngineA : IEngine
{
    public void Run()
    {
        Console.WriteLine("this is engine A");
    }
}
public class EngineB : IEngine
{
    public void Run()
    {
        Console.WriteLine("this is engine b");
    }
}
public class SeatA : ISeat
{
    public void Message()
    {
        Console.WriteLine("this is seat a");
    }
}
public class SeatB : ISeat
{
    public void Message()
    {
        Console.WriteLine("this is seat b");
    }
}

調(diào)用方:

static void Main(string[] args)
{
    List<(string, Action)> sss = new List<(string, Action)>();
    sss.Add(("1", SimpleFactory));
    sss[0].Item2();
    bool flag = true;
    while (flag)
    {
        Console.WriteLine("=================設(shè)計(jì)模式測試=================");
        Console.WriteLine("====1 - 簡單工廠模式==========================");
        Console.WriteLine("====2 - 工廠方法模式==========================");
        Console.WriteLine("====3 - 抽象工廠模式==========================");
        Console.WriteLine("====0 - 退出==================================");
        Console.WriteLine("==============================================");
        Console.Write("請輸入編號:");
        string num = Console.ReadLine();
        switch (num)
        {
            case "1":
                SimpleFactory();
                break;
            case "2":
                FactoryMethod();
                break;
            case "3":
                AbstractFactory();
                break;
            case "0":
                flag = false;
                break;
            default:
                break;
        }

        Console.WriteLine("\r\n");
    }
}

static void AbstractFactory()
{
    ICarFactory cara = new CarAFactory();
    IEngine e1 = cara.CreateEngine();
    ISeat s1 = cara.CreateSeat();
    e1.Run();
    s1.Message();

    ICarFactory carab = new CarBFactory();
    IEngine e2 = carab.CreateEngine();
    ISeat s2 = carab.CreateSeat();
    e2.Run();
    s2.Message();
}

結(jié)果:


運(yùn)行結(jié)果

源碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末需曾,一起剝皮案震驚了整個(gè)濱河市吗坚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呆万,老刑警劉巖商源,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谋减,居然都是意外死亡牡彻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門出爹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庄吼,“玉大人,你說我怎么就攤上這事以政“园” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵盈蛮,是天一觀的道長废菱。 經(jīng)常有香客問我,道長抖誉,這世上最難降的妖魔是什么殊轴? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮袒炉,結(jié)果婚禮上旁理,老公的妹妹穿的比我還像新娘。我一直安慰自己我磁,他們只是感情好孽文,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布驻襟。 她就那樣靜靜地躺著,像睡著了一般芋哭。 火紅的嫁衣襯著肌膚如雪沉衣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天减牺,我揣著相機(jī)與錄音豌习,去河邊找鬼。 笑死拔疚,一個(gè)胖子當(dāng)著我的面吹牛肥隆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播稚失,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼栋艳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了墩虹?” 一聲冷哼從身側(cè)響起嘱巾,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诫钓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篙螟,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菌湃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遍略。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惧所。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绪杏,靈堂內(nèi)的尸體忽然破棺而出下愈,到底是詐尸還是另有隱情,我是刑警寧澤蕾久,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布势似,位于F島的核電站,受9級特大地震影響僧著,放射性物質(zhì)發(fā)生泄漏履因。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一盹愚、第九天 我趴在偏房一處隱蔽的房頂上張望栅迄。 院中可真熱鬧,春花似錦皆怕、人聲如沸毅舆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憋活。三九已至污淋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間余掖,已是汗流浹背寸爆。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盐欺,地道東北人赁豆。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像冗美,于是被迫代替她去往敵國和親魔种。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容