定義:為創(chuàng)建一組相關(guān)或相互依賴的對(duì)象提供一個(gè)接口,而且無(wú)需指定他們的具體類。
在成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營(yíng)銷成為有效果、有回報(bào)的無(wú)錫營(yíng)銷推廣。創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設(shè)10多年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。
UML類圖:
(1)抽象工廠AbstractFactory:抽象工廠類,提供創(chuàng)建兩種產(chǎn)品的接口CreateProductA和CreateProductB,由派生的各個(gè)具體工廠類對(duì)其實(shí)現(xiàn)
(2)具體工廠:包括具體工廠FactoryM和具體工廠FactoryN。具體工廠FactoryM用于生產(chǎn)具體產(chǎn)品MProductA和具體產(chǎn)品MProductB,具體工廠FactoryN用于生產(chǎn)具體產(chǎn)品NProductA和具體產(chǎn)品NProductB。
(3)抽象產(chǎn)品:AbstractProductA、AbstractProductB:分別代表兩種不同類型的產(chǎn)品,由具體的產(chǎn)品派生類對(duì)其實(shí)現(xiàn)
(4)具體產(chǎn)品:包括抽象產(chǎn)品AbstractProductA所對(duì)應(yīng)的具體產(chǎn)品MProductA和NProductA,抽象產(chǎn)品AbstractProductB所對(duì)應(yīng)的具體產(chǎn)品MProductB和NProductB。
優(yōu)點(diǎn):抽象工廠模式是對(duì)工廠方法模式的改進(jìn),用于處理產(chǎn)品不只有一類的情況。抽象工廠模式除了具有工廠方法模式的優(yōu)點(diǎn)外,最主要的優(yōu)點(diǎn)就是可以在類的內(nèi)部對(duì)產(chǎn)品族進(jìn)行約束。所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián),抽象工廠模式就可以在類內(nèi)部對(duì)產(chǎn)品族的關(guān)聯(lián)關(guān)系進(jìn)行定義和描述,而不必專門引入一個(gè)新的類來(lái)進(jìn)行管理。
抽象工廠模式分離了具體類,使得客戶與類的實(shí)現(xiàn)分離
缺點(diǎn):
難以支持新種類的產(chǎn)品,不容易擴(kuò)展。產(chǎn)品族的擴(kuò)展將是一件十分費(fèi)力的事情,假如產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品,則幾乎所有的工廠類都需要進(jìn)行修改。所以使用抽象工廠模式時(shí),對(duì)產(chǎn)品等級(jí)結(jié)構(gòu)的劃分是非常重要的。
抽象工廠模式和工廠方法模式的區(qū)別就在于需要?jiǎng)?chuàng)建對(duì)象的復(fù)雜程度上。而且抽象工廠模式是三個(gè)里面最為抽象、最具一般性的。
抽象工廠模式使用場(chǎng)景:
A、當(dāng)需要?jiǎng)?chuàng)建的對(duì)象是一系列相互關(guān)聯(lián)或相互依賴的產(chǎn)品族時(shí),便可以使用抽象工廠模式。一個(gè)繼承體系中,如果存在著多個(gè)等級(jí)結(jié)構(gòu)(即存在著多個(gè)抽象類),并且分屬各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間存在著一定的關(guān)聯(lián)或者約束,就可以使用抽象工廠模式。假如各個(gè)等級(jí)結(jié)構(gòu)中的實(shí)現(xiàn)類之間不存在關(guān)聯(lián)或約束,則使用多個(gè)獨(dú)立的工廠來(lái)對(duì)產(chǎn)品進(jìn)行創(chuàng)建,則更合適一點(diǎn)。
B、 一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)。
C、同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái)。
D、系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口出現(xiàn),從而使客戶端不依賴于實(shí)現(xiàn)。
抽象工廠AbstractFactory類: #ifndef ABSTRACTFACTORY_H #define ABSTRACTFACTORY_H class AbstractProductA; class AbstractProductB; class AbstractFactory { public: virtual AbstractProductA* createProductA() = 0; virtual AbstractProductB* createProductB() = 0; }; #endif // ABSTRACTFACTORY_H FactoryM工廠類: #ifndef FACTORYM_H #define FACTORYM_H #include "AbstractFactory.h" #include "MProductA.h" #include "MProductB.h" class FactoryM : public AbstractFactory { public: virtual AbstractProductA* createProductA() { AbstractProductA* product = new MProductA(); return product; } virtual AbstractProductB* createProductB() { AbstractProductB* product = new MProductB(); return product; } }; #endif // FACTORYM_H FactoryN工廠類: #ifndef FACTORYN_H #define FACTORYN_H #include "AbstractFactory.h" #include "NProductA.h" #include "NProductB.h" class FactoryN : public AbstractFactory { public: virtual AbstractProductA* createProductA() { AbstractProductA* product = new NProductA(); return product; } virtual AbstractProductB* createProductB() { AbstractProductB* product = new NProductB(); return product; } }; #endif // FACTORYN_H AbstractProductA抽象產(chǎn)品A類: #ifndef ABSTRACTPRODUCTA_H #define ABSTRACTPRODUCTA_H class AbstractProductA { public: virtual void productMethod() = 0; }; #endif // ABSTRACTPRODUCTA_H MProductA產(chǎn)品類: #ifndef MPRODUCTA_H #define MPRODUCTA_H #include "AbstractProductA.h" #includeusing std::endl; using std::cout; class MProductA : public AbstractProductA { public: virtual void productMethod() { cout << "This is a MProductA by FactoryM" << endl; } }; #endif // MPRODUCTA_H NProductA產(chǎn)品類: #ifndef NPRODUCTA_H #define NPRODUCTA_H #include "AbstractProductA.h" #include using std::endl; using std::cout; class NProductA : public AbstractProductA { public: virtual void productMethod() { cout << "This is a NProductA by FactoryN" << endl; } }; #endif // NPRODUCTA_H AbstractProductB抽象產(chǎn)品B類: #ifndef ABSTRACTPRODUCTB_H #define ABSTRACTPRODUCTB_H class AbstractProductB { public: virtual void productMethod() = 0; }; #endif // ABSTRACTPRODUCTB_H MProductB產(chǎn)品類: #ifndef MPRODUCTB_H #define MPRODUCTB_H #include "AbstractProductB.h" #include using std::endl; using std::cout; class MProductB : public AbstractProductB { public: virtual void productMethod() { cout << "This is a MProductB by FactoryM" << endl; } }; #endif // MPRODUCTB_H NProductB產(chǎn)品類: #ifndef NPRODUCTB_H #define NPRODUCTB_H #include "AbstractProductB.h" #include using std::endl; using std::cout; class NProductB : public AbstractProductB { public: virtual void productMethod() { cout << "This is a NProductB by FactoryN" << endl; } }; #endif // NPRODUCTB_H 客戶調(diào)用程序: #include #include "AbstractFactory.h" #include "FactoryM.h" #include "FactoryN.h" using namespace std; int main() { AbstractFactory* factoryM = new FactoryM(); AbstractProductA* mproductA = factoryM->createProductA(); AbstractProductB* mproductB = factoryM->createProductB(); mproductA->productMethod(); mproductB->productMethod(); AbstractFactory* factoryN = new FactoryN(); AbstractProductA* nproductA = factoryN->createProductA(); AbstractProductB* nproductB = factoryN->createProductB(); nproductA->productMethod(); nproductB->productMethod(); delete factoryM; delete mproductA; delete mproductB; delete factoryN; delete nproductA; delete nproductB; return 0; }