設(shè)計(jì)模式-工廠模式(Factory Method)

定義(工廠模式又稱工廠方法模式)

工廠方法模式:定義一個用于創(chuàng)建對象的接口巫俺,讓子類決定實(shí)例化哪一個類俱诸。工廠方法模式是以一個類的實(shí)例化延遲到其子類馅巷。

Factory Method模式用于在不指定待創(chuàng)建對象的具體類的情況下創(chuàng)建對象急前。

Factory Method模式的主要意圖是隱藏對象創(chuàng)建的復(fù)雜性狈网。Client通常不指定要創(chuàng)建的具體類礼搁,Client將面向接口或抽象類進(jìn)行編碼饶碘,讓Factory類負(fù)責(zé)創(chuàng)建具體的類型。通常Factory類有一個返回抽象類或者接口的靜態(tài)方法馒吴。Client通常提供某種信息讓Factory類使用提供的信息來確定創(chuàng)建并返回哪個子類扎运。

將創(chuàng)建子類的責(zé)任抽象出來的好處是允許Client完全無需考慮依賴類是如何創(chuàng)建的瑟曲,這遵守依賴倒置原則(Dependency Inversion Principle,DIP)豪治。Factory Method模式另外一個好處是把負(fù)責(zé)對象創(chuàng)建的代碼集中起來洞拨,如果需要修改對象生成方式,可以輕松定位并更新负拟,而不會影響到依賴它的代碼烦衣。

在面向?qū)ο缶幊讨校话惴椒ㄊ怯靡粋€new操作符產(chǎn)生一個對象的實(shí)例掩浙。但是在一些情況下花吟,用new操作符直接生成對象會帶來一些問題。首先涣脚,要使用new運(yùn)算符創(chuàng)建一個對象必須清楚所要創(chuàng)建的對象的類信息示辈,包括類名、構(gòu)造函數(shù)等遣蚀,而有時并不現(xiàn)實(shí)矾麻。其次許多類型的對象創(chuàng)建需要一系列的步驟,可能需要計(jì)算或取得對象的初始設(shè)置芭梯,選擇生成那個子對象實(shí)例险耀,或在生成需要的對象之前必須生成一些輔助功能的對象。在這些情況下玖喘,新對象的建立就是一個過程甩牺,而不是一個簡單的操作。為輕松方便地完成復(fù)雜對象的創(chuàng)建累奈,從而引入了工廠模式贬派。

C#例子

    public abstract class Product
    {
        public abstract string GetName();
    }

    public class ProductA : Product
    {
        public override string GetName()
        {
            return "我是A產(chǎn)品!";
        }
    }
    public class ProductB:Product
    {
        public override string GetName()
        {
            return "我是B產(chǎn)品澎媒!";
        }
    }

    public abstract class Factory
    {
        public abstract Product CreateProduct();
    }
    public class FactoryA : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductA();
        }
    }
    public class FactoryB : Factory
    {
        public override Product CreateProduct()
        {
            return new ProductB();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Factory[] factories = new Factory[2];

            factories[0] = new FactoryA();
            factories[1] = new FactoryB();

            foreach (var factory in factories)
            {
                Product product = factory.CreateProduct();
                Console.WriteLine(product.GetName());
            }
            Console.ReadLine();
        }
    }

工廠方法模式參與者:

  • Product:Product角色搞乏,定義工廠方法所創(chuàng)建的對象的接口
  • Product*:具體Product角色,實(shí)現(xiàn)Product接口
  • Factory:抽象的工廠角色戒努,聲明工廠方法请敦,該方法返回一個Product類型的對象。
    Factory可以定義一個工廠方法的默認(rèn)實(shí)現(xiàn)储玫,返回一個默認(rèn)的Product對象侍筛。可以調(diào)用工廠方法以創(chuàng)建一個Product對象撒穷。
  • Factory*:具體的工廠角色匣椰,創(chuàng)建具體Product的子工廠,重寫工廠方法以返回一個Product實(shí)例

工廠方法模式適用情形

  • 當(dāng)一個類不知道它所必須創(chuàng)建的對象的類信息的時候
  • 當(dāng)一個類希望由它來指定它所創(chuàng)建的對象的時候
  • 當(dāng)類將創(chuàng)建對象的職責(zé)委托給多個輔助子類中的某一個端礼,并且希望將哪一個輔助之類是代理者這一信息局部化的時候

工廠方法模式特點(diǎn)

  • 使用工廠方法在一個類的內(nèi)部創(chuàng)建對象通常比直接創(chuàng)建對象更靈活
  • 工廠方法模式通過面向?qū)ο蟮氖址ㄎ炎Γ瑢⑺獎?chuàng)建的具體對象的創(chuàng)建工作延遲到子類弛车,從而提供了一種擴(kuò)展的策略齐媒,較好的解決了緊耦合的關(guān)系
  • 工廠方法模式遵守依賴倒置原則(Dependency Inversion Principle蒲每,DIP)

其他

工廠方法模式與簡單工廠模式區(qū)別

  • 工廠方法模式和簡單工廠模式在結(jié)構(gòu)上的不同是很明顯的。工廠方法模式的核心是一個抽象工廠類喻括,而簡單工廠模式把核心放在一個具體工廠類上邀杏。工廠方法模式可以允許很多具體工廠類從抽象工廠類中將創(chuàng)建行為繼承下來,從而可以成為多個簡單工廠模式的綜合唬血,進(jìn)而推廣了簡單工廠模式望蜡。
  • 工廠方法模式退化后可以變得很像簡單工廠模式。如果非常確定一個系統(tǒng)只需要一個具體工廠類拷恨,那么就不妨把抽象工廠類合并到具體的工廠類中去脖律。由于只有一個具體工廠類,所以不妨將工廠方法改成為靜態(tài)方法腕侄,這時候就得到了簡單工廠模式
    /// <summary>
    /// 簡單工廠小泉,和工廠模式對比用
    /// </summary>
    public class EasyFactory
    {
        // 簡單工廠,根據(jù)字符串創(chuàng)建相應(yīng)的對象
        public static Product CreateProduct(String name)
        {

            switch (name)
            {
                case "A":
                    return new ProductA();
                case "B":
                    return new ProductB();
                default:
                    throw new Exception("產(chǎn)品不存在冕杠!");
            }
        }
    }

源碼地址

dotnet-design-patterns

其他設(shè)計(jì)模式

23種設(shè)計(jì)模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末微姊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子分预,更是在濱河造成了極大的恐慌兢交,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笼痹,死亡現(xiàn)場離奇詭異配喳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凳干,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門晴裹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纺座,你說我怎么就攤上這事息拜。” “怎么了净响?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵少欺,是天一觀的道長。 經(jīng)常有香客問我馋贤,道長赞别,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任配乓,我火速辦了婚禮仿滔,結(jié)果婚禮上惠毁,老公的妹妹穿的比我還像新娘。我一直安慰自己崎页,他們只是感情好鞠绰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著飒焦,像睡著了一般蜈膨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牺荠,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天翁巍,我揣著相機(jī)與錄音,去河邊找鬼休雌。 笑死灶壶,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杈曲。 我是一名探鬼主播驰凛,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鱼蝉!你這毒婦竟也來了洒嗤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤魁亦,失蹤者是張志新(化名)和其女友劉穎渔隶,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洁奈,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡间唉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了利术。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呈野。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖印叁,靈堂內(nèi)的尸體忽然破棺而出被冒,到底是詐尸還是另有隱情,我是刑警寧澤轮蜕,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布昨悼,位于F島的核電站,受9級特大地震影響跃洛,放射性物質(zhì)發(fā)生泄漏率触。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一汇竭、第九天 我趴在偏房一處隱蔽的房頂上張望葱蝗。 院中可真熱鬧穴张,春花似錦、人聲如沸两曼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽合愈。三九已至叮贩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佛析,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工彪蓬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寸莫,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓档冬,卻偏偏與公主長得像膘茎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子酷誓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351