head first設計模式 工廠模式

2021-10-23 21:57:29 字數 2103 閱讀 1009

這裡描述的設計模式,**於head first系列,這裡的工廠模式是基於書中披薩店的例子。

簡單工廠的設計就是說把所有需要建立的東西放在乙個普通的函式中,以書中披薩的例子來講,假設有一百種披薩,就再函式中全部處理完。當然簡單工廠內部的實現也可以有技巧,常見的就是if或者switch逐個處理,但是如果太多了,這裡就麻煩了。科技設計map,把函式和對應的key儲存下來。直接判斷的方式,基本只適用於分支比較少的情況。

pizza* create_pizza(string type)

else if(type == 'b')

.....

else

return nullptr;

}

工廠方法的處理,其實就是上面的處理做抽象,做封裝。因為這裡披薩只是乙個產品,工廠用於建立產品,而產品最終怎麼用取決於業務,也就是所謂的高層,這裡就是披薩商店。每個商店既然要賣披薩,肯定要製造披薩,所以這裡就得到乙個共通的地方,建立方法。

這就是所謂工廠方法,把具體的實現方式推遲到例項中,由例項或者說業務自己決定怎麼處理這個介面。這裡說叫做設計模式,就感覺有點扯虛了,其實就是很簡單的oo,稍微抽象一下,然後每個自己實現自己的處理方式而已。

class pizzastore
然後具體的商店就繼承自虛基類,然後實現自己的方法。這裡注意一下,pizza也是抽象過的,不是某種具體的pizza。這裡函式的實現也不能放在h裡面,需要放在原始檔中。首先pizza的抽象,是需要遵循設計原則中的,依賴於介面,而不依賴於實現。另外把實現放在源中,而不是放在標頭檔案中,是為了減少編譯依賴(effective c++),如果放在了標頭檔案中,上層稍微有改動的標頭檔案,就會導致下次編譯時所有依賴標頭檔案的重新編譯,這裡也算是需要遵循依賴介面的,因為在設計中,沒有使用具體類的例項,而是使用的是抽象介面,所以介面就只需要前置宣告,而不需要包含對應的標頭檔案。前面這點算是相互依存吧。

class mypizzastore : public pizzastore

抽象工廠有點像是工廠方法和策略模式的組合,再包裝一次,這裡不以書中原料工廠的例子展開。

class pizza;

class pizzafactory;

class pizzastroe

這裡簡單的處理一下上面店鋪的模式,把工廠抽象出來,比如a工廠和b工廠有不同的實現,但是都是繼承自pizzafactory。然後在建立商店的時候,指定自己的商店名字,當型別使用,這個型別可以預設找到乙個對應工廠,用於初始化usefac,或者說直接在建構函式中傳遞工廠。然後在建立披薩的時候,通過usefac的工廠介面去建立乙個,建立完之後呼叫aftercreatepizza,這裡局看具體的pizza怎麼實現了,書中提到了原料工廠,原料工廠是用在pizza中的,這裡不具體提及pizza的實現,因為設計pizza和設計店鋪的原理是一樣的。關於抽象工廠有乙個重要概念,依賴倒置,即高層不能依賴於底層實現,兩者都需要盡量去依賴於抽象,這裡說盡量,是因為沒有辦法完全做到不依賴於例項,總有地方會依賴於具體的處理,但是需要盡量在業務上依賴於介面。比如這裡商店是業務,是高層,要實現的東西是披薩,如果直接像上面的工廠方法一樣,就導致每個商店都要依賴於具體的商品型別,需要知道有哪些商品,如果後面有商品的變化,且這個商品可能在多個店鋪中處理,那就會導致多個商鋪都需要修改,但是這裡把它封裝到工廠中,這裡依賴於抽象工廠介面,就實現了高層對底層的解耦,不再依賴於具體的處理。

但是這裡依賴倒置又無法完全實現,比如對於製造來講,工廠就是高層,披薩就是底層,工廠總還是需要知道具體的披薩型別才能處理,只是它經過自己處理之後,為上層業務提供了抽象介面,這裡的工程內部實現,其實就是上面的工廠方法實現。

抽象工廠的設計原則

這些東西都是說盡量去滿足,沒有辦法完全滿足的,因為只要需要使用,就總需要例項化。

其實工廠模式,更像是中介軟體,封裝一下具體處理,為上層提供抽象,總的就是為了解耦,於拓展。比如這裡如果用了抽象工廠模式,後面如果需要新增了一種商品,就只需要在工廠中修改,而上層基本無感,只需要知道有這種產品(因為需求就是從這裡來的),而不關心具體實現,也完全不需要修改自己的業務處理。

HeadFirst 設計模式 工廠模式

定義乙個建立物件的介面,由子類決定要例項化的類。工廠方法將類例項推遲到子類。依賴倒置。第一種方式是 class pizzastore public pizza orderpizza string type class pizzafactory pizza pizza null 將pizza這個例項提...

Head First設計模式四 工廠模式

除了使用new操作符之外,還有更多製造物件的方法,比如使用工廠模式封裝例項化的行為。工廠模式在輔助面向介面程式設計時很有作用,它用來封裝物件的建立。本章從簡單工廠開始講起,並逐步深入了解工廠方法 factory method 和抽象工廠模式 abstract factory 從嚴格意義上來說簡單工廠...

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...