設計模式(一) 工廠方法 和 抽象工廠

2021-09-25 10:11:00 字數 1860 閱讀 9756

其實工廠方法和抽象工廠是兩個設計模式,之所以將它兩放在一起是因為它兩非常相似,都是解決物件建立這一類的問題。

工廠,就是利用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 ...