抽象工廠模式

2022-12-11 04:09:02 字數 3398 閱讀 9670

抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向具體產品提供乙個介面,使客戶端在不必指定產品的具體的情況下,建立多個產品族中的產品物件。

任何接受父型別的地方,都應當能夠接受子型別。因此,實際上系統所需要的,僅僅是型別與這些抽象產品角色相同的一些例項,而不是這些抽象產品的例項。換言之,也就是這些抽象產品的具體子類的例項。

工廠類負責建立抽象產品的具體子類的例項。

為了方便引進抽象工廠模式,引進乙個新概念:產品族(product family)。所謂產品族,是指位於不同產品等級結構,功能相關聯的產品組成的家族。

所謂的抽象工廠是指乙個工廠等級結構可以建立出分屬於不同產品等級結構的乙個產品族中的所有物件。

抽象工廠模式(abstract factory pattern):提供乙個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。抽象工廠模式又稱為kit模式,屬於物件建立型模式。

抽象工廠(abstract factory)角色:擔任這個角色的是工廠方法模式的核心,它是與應用系統商業邏輯無關的。

具體工廠(concrete factory)角色:這個角色直接在客戶端的呼叫下建立產品的例項。這個角色含有選擇合適的產品物件的邏輯,而這個邏輯是與應用系統的商業邏輯緊密相關的。

抽象產品(abstract product)角色:擔任這個角色的類是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。

具體產品(concrete product)角色:抽象工廠模式所建立的任何產品物件都是某乙個具體產品類的例項。這是客戶端最終需要的東西,其內部一定充滿了應用系統的商業邏輯。

抽象工廠模式的主要優點是隔離了具體類的生成,使得客戶並不需要知道什麼被建立。由於這種隔離,更換乙個具體工廠就變得相對容易。

所有的具體工廠都實現了抽象工廠中定義的那些公共介面,因此只需改變具體工廠的例項,就可以在某種程度上改變整個軟體系統的行為。另外,應用抽象工廠模式可以實現高內聚低耦合的設計目的,因此抽象工廠模式得到了廣泛的應用。

增加新的工廠和新的產品族很方便。

在以下情況下可以使用抽象工廠模式:

乙個系統不應當依賴於產品類例項如何被建立、 組合和表達的細節,這對於所有形態的工廠模式都是重要的。

系統有多於乙個的產品族,而客戶端只消費其中某一產品族。

屬於同乙個產品族的產品是在一起使用的,這一約束必須在系統的設計中體現出來。

系統提供乙個產品類的庫,所有的產品以同樣的介面出現,從而使客戶端不依賴於實現

遊戲中使用抽象工廠的地方有: 基本上任何有批量的同類形式的子件地方就會有工廠的存在。(例項工廠就是工廠,而抽象工廠僅僅是工廠的乙個抽象層而已。)

在遊戲中,比如有一些場景,可是場景有很多態別,但是所有的具體場景都有相同的共性(如房屋,植物等),將這些共性抽取出來,形成乙個抽象類,然後在程式中具體實現該類,這樣乙個抽象類就是乙個簡單的抽象工廠

1:例如,在音訊方面,乙個音訊的抽象工廠派生出不同的工廠,有**工廠,音效工廠。音效工廠中又有乙個建立3d音效節點的方法,乙個建立普通音效節點的方法。

終端使用者只需要soundfactory->create3dnode( pfilename );就可以建立乙個節點了。

2:場景物件。

3:渲染物件。

程式實現

#include

//class food

virtual ~food() {}

public:

virtual std::string getname()

protected:

std::string _name;

};//

class burger : public food

burger(std::string name)

virtual ~burger() {}

};//

class chips : public food

chips(std::string name)

virtual ~chips(){}

};//

class chickenwing : public food

chickenwing(std::string name)

virtual ~chickenwing() {}

};class fastfoodfactory

virtual ~fastfoodfactory() {}

public:

virtual burger* makeburger()

virtual chips* makechips()

virtual chickenwing* makechickenwing()

};class macdonaldfactory : public fastfoodfactory

virtual ~macdonaldfactory() {}

public:

virtual burger* makeburger()

virtual chips* makechips()

};class kfcfactory : public fastfoodfactory

virtual ~kfcfactory() {}

public:

virtual burger* makeburger()

virtual chips* makechips()

virtual chickenwing* makechickenwing()

};class shop

virtual ~shop(){};

virtual void foodlist() = 0;

public:

virtual void createshop(fastfoodfactory *) = 0;

};//

class macdonaldshop : public shop

virtual ~macdonaldshop()

public:

virtual void createshop(fastfoodfactory *a);

virtual void foodlist();

protected:

burger *_burger;

chips *_chips;

};//

class kfcshop : public shop

virtual ~kfcshop()

public:

virtual void createshop(fastfoodfactory *a);

virtual void foodlist();

protected:

burger *_burger;

chips *_chips;

chickenwing *_chicken;

};#include #include ""

int main()

簡單工廠模式,工廠方法模式和抽象工廠模式的異同

簡單工廠模式,工廠方法模式和抽象工廠模式都是屬於建立型設計模式,這三種建立型模式都不需要知道具體類。我們掌握一種思想,就是在建立乙個物件時,需要把容易發生變化的地方給封裝起來,來控制變化 變化,封裝 以適應客戶的變動,專案的擴充套件。用這三種設計模式都可以實現,那究竟這三種設計模式有什麼異同呢?下面...

工廠管理模式

2 質量問題未歸零 發現問題後不處理,不改善。出現了問題,開始會引起轟動,議論紛紛。但到最後卻不了了之。比如 倉庫裡的物料就有次品,出來的產品有瑕疵。結果沒有人將次品物料拿出來。次品原料又到了生產線。3 缺乏科學的方法和裝置 憑經驗來檢驗。沒有科學有效的檢驗方法和裝置。憑主觀想象是行不通的了 4 品...

工廠方法模式

概述在軟體系統中,經常面臨著 某個物件 的建立工作,由於需求的變化,這個物件的具體實現經常面臨著劇烈的變化,但是它卻擁有比較穩定的介面。如何應對這種變化?提供一種封裝機制來隔離出 這個易變物件 的變化,從而保持系統中 其它依賴該物件的物件 不隨著需求的改變而改變?這就是要說的factory meth...