其實工廠方法和抽象工廠是兩個設計模式,之所以將它兩放在一起是因為它兩非常相似,都是解決物件建立這一類的問題。
工廠,就是利用c++動態多型的機制(虛函式,靜態多型是繼承),將物件的具體建立也就是new的部分延遲到乙個小黑屋裡面。
抽象工廠是在工廠方法的基礎上進行的擴充套件,所以我們先了解什麼是工廠方法。
工廠方法,在這裡我們舉乙個例子,我們要建立乙個英靈,英靈又有好多種類的,比如archer,berserker,assassin,等等。
很顯然,我們能夠寫出如下**:
class zero
; virtual void born() = 0;
};class archer : public zero
};class berserker : public zero
};class assissan : public zero
};
在呼叫時,比如我們要召喚紅a的話,一般我們都會這麼寫:
zero* zero = new archer();
zero->born();
這樣寫看起來沒什麼問題,但是這樣寫耦合度高,不符合高聚合低耦合的c++物件導向的原則。
!會包含子類的標頭檔案,會產生編譯時依賴!
運用工廠方法,我們可以定義乙個factory類來建立並返回這個物件:
class zerofactory
;
這樣我們就可以為每乙個職介的英靈都建立乙個工廠:
class arche***ctory : public zerofactory
; virtual zero* createzero() };
class berserke***ctory : public zerofactory
; virtual zero* createzero() };
class assissanfactory : public zerofactory
; virtual zero* createzero()
};
當然,這裡我只是將他們寫在一起了,實際情況它們一般都不在乙個cpp裡面,並且有一種大多數的做法就是在程式起來的時候,將每個factory都儲存乙個例項放在乙個map中管理起來,這個之後再說。
這樣我們只用傳遞乙個factory的指標就能建立對應的zero。
缺點:要求建立英靈的方法/引數相同(都是乙個servant)。
抽象工廠方法。
應對「多系列物件的建立」,即建立的多個物件之間存在相互依賴,或作用的關係,並且不同系列的物件不能相互依賴。
缺點:難以應對「新物件的需求變動」。
這樣看起來好像比較難以理解。
還是舉乙個例子:
為了召喚英靈,我們首先需要乙個servant,還需要乙個儀式,並且乙個servant只能通過一種特定儀式建立一種英靈。
比如士郎就只能建立saber。
用工廠方法寫的話,這裡servant需要乙個工廠,儀式也需要乙個工廠,**如下(只舉乙個子類):
class servant
;class ling : public servant
;class servantfactory
;class lingfactory : public servantfactory
};
這只是servant的工廠,還有儀式的沒寫。。。
這樣看起來就有點臃腫了。
因為這一套是關聯的,所以我們可以將servant的建立和儀式的建立放到乙個工廠裡面。
class fatezerofactory
;
呃就這樣了。。。 設計模式 抽象工廠方法和工廠方法
工廠方法模式定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個。工廠方法讓類把例項化推遲到子類。抽象工廠模式提供乙個介面,用於建立相關或依賴物件的家族,而不需要明確指定具體類。從pizzastore的角度,來理解上面的這個類圖 抽象工廠的任務是,定義乙個建立一組產品的介面。這個介面內的每個方...
設計模式 工廠模式(工廠方法 抽象工廠)
1 工廠方法模式 factory method 定義乙個用於建立物件的介面,讓子類決定例項化哪個類。工廠方法使乙個類的例項化延遲到其子類。正如建立交通工具,可以通過不同的工廠方法建立所需的物件。類圖 對比 1 工廠方法在產品維度,即類圖中movable方向拓展比較方便,只需增加對應的類及相應的工廠方...
設計模式 簡單工廠 工廠方法 抽象工廠方法模式
簡介 工廠方法模式分為 簡單工廠模式 工廠方法模式 抽象工廠方法模式 簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法 static factory method 模式,但不屬於23種gof設計模式之一。簡單工廠模式是由乙個工廠物件決定建立出哪一種產品類的實 uml圖示例 public class ...