抽象工廠模式

定義一個(gè)抽象工廠鸟蟹,然后實(shí)現(xiàn)若干個(gè)子類工廠泣洞,用于實(shí)例化不同的產(chǎn)品子類對(duì)象。

abstract class Factory
{
    public ProductA CreateProductA();

    public ProductB CreateProductB();
}

class Factory1 : Factory
{
    override public ProductA CreateProductA()
    {
        return new ProductA1();
    }

    override public ProductB CreateProductB()
    {
        return new ProductB1();
    }
}

class Factory2 : Factory
{
    override public ProductA CreateProductA()
    {
        return new ProductA2();
    }

    override public ProductB CreateProductB()
    {
        return new ProductB2();
    }
}

調(diào)用

Factory factory1 = new Factory1();
ProductA = factory1.CreateProductA();
ProductB = factory1.CreateProductB(); 
Factory factory2 = new Factory();
ProductA = factory2.CreateProductA();
ProductB = factory2.CreateProductB();

優(yōu)點(diǎn)

  • 現(xiàn)有產(chǎn)品的子類產(chǎn)品擴(kuò)展方便
    比如秀仲,ProductA衍生出新的子類產(chǎn)品ProductA3融痛。則只需要擴(kuò)展一個(gè)新的工廠Factory3即可,不需要修改原有的工廠類神僵。

缺點(diǎn)

  • 新類型的產(chǎn)品無法擴(kuò)展雁刷,只能修改原有代碼
    比如新添加一個(gè)產(chǎn)品,ProductC保礼。首先需要在抽象工廠Factory中添加接口:
public ProductC CreateProductC();

還要在所有工廠子類中實(shí)現(xiàn)這個(gè)接口沛励。違背了“開閉原則”。

舉例

  • 如果想要封裝不同數(shù)據(jù)庫的差異炮障,首先定義了一個(gè)抽象數(shù)據(jù)庫工廠類DateBaseFactory目派,然后定義了基本的接口。之后繼承此抽象工廠胁赢,實(shí)現(xiàn)了不同類型的數(shù)據(jù)庫工廠企蹭,DataBaseFactoryMySQL, DataBaseFactoryMongo。

  • 如果現(xiàn)在要支持SQLServer,則非常方便谅摄,新添加一個(gè)DataBaseFactorySQLServer即可徒河。

  • 但此時(shí)要對(duì)數(shù)據(jù)庫添加新的操作,則要修改每一個(gè)類螟凭,添加相對(duì)的接口虚青。

改進(jìn)

  • 從調(diào)用具體工廠的代碼可以看出,調(diào)用者雖然沒有與具體的產(chǎn)品類耦合螺男,但卻與具體的工廠類耦合了棒厘。為了解決這個(gè)問題,我們可以使用配置文件下隧,記錄要使用的工廠類字符串奢人,然后在代碼中使用反射動(dòng)態(tài)創(chuàng)建工廠對(duì)象,從而讓調(diào)用者也與具體的工廠類解藕淆院。

  • 畢竟何乎,修改配置文件,要比修改代碼方便的多土辩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末支救,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拷淘,更是在濱河造成了極大的恐慌各墨,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件启涯,死亡現(xiàn)場離奇詭異贬堵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)结洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門黎做,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人松忍,你說我怎么就攤上這事蒸殿。” “怎么了鸣峭?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵伟桅,是天一觀的道長。 經(jīng)常有香客問我叽掘,道長,這世上最難降的妖魔是什么玖雁? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任更扁,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浓镜。我一直安慰自己溃列,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布膛薛。 她就那樣靜靜地躺著听隐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哄啄。 梳的紋絲不亂的頭發(fā)上雅任,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音咨跌,去河邊找鬼沪么。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锌半,可吹牛的內(nèi)容都是我干的禽车。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刊殉,長吁一口氣:“原來是場噩夢啊……” “哼殉摔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起记焊,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤逸月,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亚亲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彻采,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年捌归,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肛响。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜索,死狀恐怖特笋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巾兆,我是刑警寧澤猎物,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站角塑,受9級(jí)特大地震影響蔫磨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圃伶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一堤如、第九天 我趴在偏房一處隱蔽的房頂上張望蒲列。 院中可真熱鬧,春花似錦搀罢、人聲如沸蝗岖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抵赢。三九已至,卻和暖如春唧取,著一層夾襖步出監(jiān)牢的瞬間铅鲤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工兵怯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留彩匕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓媒区,卻偏偏與公主長得像驼仪,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袜漩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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