設計模式之工廠模式二三事

2022-09-04 11:54:08 字數 2998 閱讀 3141

很久沒有寫過c++的專案了,最近看了看設計模式,對於工廠模式略有心得,故寫出來分享。

工廠模式大致分為三類:簡單工廠模式、工廠方法模式、抽象工廠模式

ok,上圖說明,還是用網上流行的做菜比喻。

無工廠情況

我想吃紅燒魚,沒問題,我自己做(new):

fish *f = new braisingfish; //自己做紅燒魚

f->delicious(); //美味啊

可是做了幾天後,我不想自己做(new)了,太累,咋辦?建乙個烹飪魚工廠給我做魚。

簡單工廠模式

我想吃紅燒魚,現在不用自己做(new)了,直接去找烹飪工廠,烹飪工廠給我做紅燒魚(cookfish)

cookfishfactory *cff = new cookfishfactory; //烹飪工廠

fish *f = cff->cookfish(); //烹飪工廠給我做紅燒魚

f->delicious(); //美味啊

優點:1、以後都不用自己做紅燒魚了,直接讓工廠做。(解決了**中大量new的問題)。

2、工廠做魚的方式更靈活,我什麼都不用管了。

缺點:下面就說。

工廠方法模式

天天都吃紅燒魚,扛不住了,我要吃清蒸魚,怎麼辦?自己做?太累了,還得學清蒸魚的做法,改進烹飪工廠?不行,不能改進工廠(開閉法則),怎麼辦?!無解啊,看來簡單工廠模式不行,我得換一種模式,不能由烹飪魚工廠來直接做紅燒魚, 我專門建乙個烹飪紅燒魚的工廠,讓烹飪魚工廠將烹飪紅燒魚的工作外包給烹飪紅燒魚的工廠。

我想吃紅燒魚,先找烹飪魚工廠,烹飪魚工廠將工作外包給烹飪紅燒魚的工廠:

cookfishfactory *cff = new cookbraisingfishfactory;

fish *f = cff->cookfish();

f->delicious();

那麼我想吃清蒸魚咋辦?!

增加乙個清蒸魚的外包工廠

這樣當我想吃清蒸魚了,

cookfishfactory *cf = new cooksteamedfactory;

foodproduct *fp = cf->cookfood();

這樣,在不違背開閉法則的前提下解決了簡單工廠模式的缺點。

優點:1、簡單工廠模式具有的優點。

2、解決了簡單工廠模式的缺點。

缺點:下面說。

抽象工廠模式

天天吃魚,不行,膩了,想換換口味,吃點豬肉吧,怎麼辦?在工廠方法模式下,我可以再建乙個烹飪豬肉的工廠,然後下面有烹飪紅燒肉啊,清蒸肉啊等等,這當然可以,但為了吃豬肉,我得建好幾個工廠,譬如紅燒肉工廠、清蒸肉工廠,有沒有辦法不建這麼多工廠呢?!

懷著這個想法,我發現不管是魚還是肉,都有幾種相同的做法,譬如紅燒,清蒸。

橫座標表示肉類,有魚肉、豬肉(產品等級結構),縱座標表示製作方法(產品族),可清蒸,可紅燒,這樣,我可以再次設計我的工廠,分為紅燒工廠和清蒸工廠,乙個工廠可以做兩種肉類(抽象工廠)。

如果我想吃紅燒肉,我可以這樣做:

cookfactory *cf = new cookbraisingfactory;

pork *p = cf->cookpork();

p->delicious();

如果我想吃清蒸肉,這樣做:

cookfactory *cf = new cooksteamedfactory;

pork *p = cf->cookpork();

p->delicious();

紅燒魚做法:

cookfactory *cf = new cookbraisingfactory;

fish *f = cf->cookfish();

f->delicious();

清蒸魚做法:

cookfactory *cf = new cooksteamedfactory;

fish *f = cf->cookfish();

f->delicious();

這樣,如果我又想出一種新的做法,譬如水煮的時候,我可以新建乙個水煮的工廠,同時做水煮魚和水煮肉。

但是,如果我想增加一種肉類,比如雞肉咋辦?!沒轍。

那麼抽象工廠模式有什麼優點呢?因為我吃的肉類是有限的,就雞肉、魚肉、豬肉、牛肉等等,輕易不會再增加肉的型別了,但各種肉的製作方法是有不同的,而且可以增加,比如油悶,爆炒等等,什麼時候我想出了一種新做法,直接增加乙個相應的工廠就行,不用再根據不同的原料與不同的做法增加不同的工廠。

ok,不說吃了,拿it舉個例子吧,譬如qt圖形庫,圖形庫由很多元件組成,有button,view,widget等等,這些東西就相當於我們的豬肉、魚肉、牛肉等等,qt是跨平台的,可以在windows上跑,可以在linux上跑,也可以在osx上跑,這些平台,就相當於我們的紅燒工廠、清蒸工廠、水煮工廠。如果我們需要增加乙個產品族,譬如在solaris上跑的話,很容易,增加乙個工廠就行,不會違背開閉法則,但如果想增加乙個產品等級結構,譬如增加乙個控制項,就很麻煩了,需要修改所有的工廠,會違背開閉法則。

優點:很容易增加產品族,不違背開閉法則。

缺點:難以新增產品等級結構,會違背開閉法則。

設計模式二三事 組合模式

三 組合模式 組合模式允許派生類包含基類例項,以此來構成相互巢狀的組合方式,可構成類似樹形結構或者線性表,具體 如下 the base composite class company virtual void add company pcom virtual void show int depth ...

設計模式二三事 單例模式

一 單例模式 單例模式模式能夠保證乙個類的物件例項只有乙個,具體的做法是將類的建構函式設定為私有或者受保護,然後再提供乙個靜態介面,通過該介面可以建立或者獲取該類的唯一例項物件,具體的 如下表示 class singleton public static singleton getinstance ...

設計模式(二 三)工廠模式 2 工廠方法模式

沿用 設計模式 二 工廠模式 1 簡單工廠模式 中關於運算器 operation 的例子。針對在 easy factory 中提出的,破壞 開 閉原則 的問題,factory method 提出了另一種解決方案 將生產運算器的工廠抽象出來 absoperationfactory 然後為原來每乙個需要...