0 引言
0.1 目的
本文檔給出設(shè)計(jì)模式之——AbstractFactory模式的簡化詮釋,并給出其C++實(shí)現(xiàn)。
0.2 說明
Project
|
Design Pattern Explanation(By K_Eckel)
|
Authorization
|
Free Distributed but Ownership Reserved
|
Date
|
|
Test Bed
|
MS Visual C++ 6.0
|
0.3 參考
在本文檔的寫作中,參考了以下的資源,在此列出表示感謝:
u 書籍
[GoF 2000]:GoF,Design Patterns-Elements of Reusable Object-Oriented Software
Addison-Wesley 2000/9.
[Martine 2003]:Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.
0.4 聯(lián)系作者
Author
|
K_Eckel
|
State
|
Candidate for Master’s Degree School of
|
E_mail
|
frwei@whu.edu.cn
|
2 AbstractFactory模式
2.1 問題
假設(shè)我們要開發(fā)一款游戲,當(dāng)然為了吸引更多的人玩,游戲難度不能太大(讓大家都沒有信心了,估計(jì)游戲也就沒有前途了),但是也不能太簡單(沒有挑戰(zhàn)性也不符合玩家的心理)。于是我們就可以采用這樣一種處理策略:為游戲設(shè)立等級(jí),初級(jí)、中級(jí)、高級(jí)甚至有BT級(jí)。假設(shè)也是過關(guān)的游戲,每個(gè)關(guān)卡都有一些怪物(monster)守著,玩家要把這些怪
物干掉才可以過關(guān)。作為開發(fā)者,我們就不得不創(chuàng)建怪物的類,然后初級(jí)怪物、中級(jí)怪物等都繼承自怪物類(當(dāng)然不同種類的則需要另創(chuàng)建類,但是模式相同)。在
每個(gè)關(guān)卡,我們都要?jiǎng)?chuàng)建怪物的實(shí)例,例如初級(jí)就創(chuàng)建初級(jí)怪物(有很多種類)、中級(jí)創(chuàng)建中級(jí)怪物等。可以想象在這個(gè)系統(tǒng)中,將會(huì)有成千上萬的怪物實(shí)例要?jiǎng)?chuàng)
建,問題是還要保證創(chuàng)建的時(shí)候不會(huì)出錯(cuò):初級(jí)不能創(chuàng)建BT級(jí)的怪物(玩家就郁悶了,玩家一郁悶,游戲也就掛掛了),反之也不可以。
AbstractFactory模式就是用來解決這類問題的:要?jiǎng)?chuàng)建一組相關(guān)或者相互依賴的對(duì)象。
2.2 模式選擇
AbstractFactory模式典型的結(jié)構(gòu)圖為:

圖2-1:AbstractFactoryPattern結(jié)構(gòu)圖
AbstractFactory模式關(guān)鍵就是將這一組對(duì)象的創(chuàng)建封裝到一個(gè)用于創(chuàng)建對(duì)象的類(ConcreteFactory)中,維護(hù)這樣一個(gè)創(chuàng)建類總比維護(hù)n多相關(guān)對(duì)象的創(chuàng)建過程要簡單的多。
2.3 實(shí)現(xiàn)
AbstractFactory模式的實(shí)現(xiàn)比較簡單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用C++實(shí)現(xiàn),并在VC 6.0下測試運(yùn)行)。
代碼片斷1:Product.h //Product.h
#ifndef _PRODUCT_H_ #define _PRODUCT_H_
class AbstractProductA { public: virtual ~AbstractProductA();
protected: AbstractProductA();
private:
};
class AbstractProductB { public: virtual ~AbstractProductB();
protected: AbstractProductB();
private:
};
class ProductA1:public AbstractProductA { public: ProductA1();
~ProductA1();
protected:
private:
};
class ProductA2:public AbstractProductA { public: ProductA2();
~ProductA2();
protected:
private:
};
class ProductB1:public AbstractProductB { public: ProductB1();
~ProductB1();
protected:
private:
};
class ProductB2:public AbstractProductB { public: ProductB2();
~ProductB2();
protected:
private:
};
#endif //~_PRODUCT_H_
|
代碼片斷2:Product.cpp //Product.cpp
#include "Product.h"
#include <iostream> using namespace std;
AbstractProductA::AbstractProductA() {
}
AbstractProductA::~AbstractProductA() {
}
AbstractProductB::AbstractProductB() {
}
AbstractProductB::~AbstractProductB() {
}
ProductA1::ProductA1() { cout<<"ProductA1..."<<endl; }
ProductA1::~ProductA1() {
}
ProductA2::ProductA2() { cout<<"ProductA2..."<<endl; }
ProductA2::~ProductA2() {
}
ProductB1::ProductB1() { cout<<"ProductB1..."<<endl; }
ProductB1::~ProductB1() {
}
ProductB2::ProductB2() { cout<<"ProductB2..."<<endl; }
ProductB2::~ProductB2() {
}
|
代碼片斷3:AbstractFactory.h //AbstractFactory.h
#ifndef _ABSTRACTFACTORY_H_ #define _ABSTRACTFACTORY_H_
class AbstractProductA; class AbstractProductB;
class AbstractFactory { public: virtual ~AbstractFactory();
virtual AbstractProductA* CreateProductA() = 0;
virtual AbstractProductB* CreateProductB() = 0;
protected: AbstractFactory();
private:
};
class ConcreteFactory1:public AbstractFactory { public: ConcreteFactory1();
~ConcreteFactory1();
AbstractProductA* CreateProductA();
AbstractProductB* CreateProductB();
protected:
private:
};
class ConcreteFactory2:public AbstractFactory { public: ConcreteFactory2();
~ConcreteFactory2();
AbstractProductA* CreateProductA();
AbstractProductB* CreateProductB();
protected:
private:
}; #endif //~_ABSTRACTFACTORY_H_
|
代碼片斷4:AbstractFactory.cpp //AbstractFactory.cpp
#include "AbstractFactory.h" #include "Product.h"
#include <iostream> using namespace std;
AbstractFactory::AbstractFactory() {
}
AbstractFactory::~AbstractFactory() {
}
ConcreteFactory1::ConcreteFactory1() {
}
ConcreteFactory1::~ConcreteFactory1() {
}
AbstractProductA* ConcreteFactory1::CreateProductA() { return new ProductA1(); }
AbstractProductB* ConcreteFactory1::CreateProductB() { return new ProductB1(); }
ConcreteFactory2::ConcreteFactory2() {
}
ConcreteFactory2::~ConcreteFactory2() {
}
AbstractProductA* ConcreteFactory2::CreateProductA() { return new ProductA2(); }
AbstractProductB* ConcreteFactory2::CreateProductB() { return new ProductB2(); }
|
代碼片斷5:main.cpp //main.cpp
#include "AbstractFactory.h"
#include <iostream> using namespace std;
int main(int argc,char* argv[]) { AbstractFactory* cf1 = new ConcreteFactory1();
cf1->CreateProductA(); cf1->CreateProductB();
AbstractFactory* cf2 = new ConcreteFactory2(); cf2->CreateProductA(); cf2->CreateProductB();
return 0; }
|
AbstractFactory模式的實(shí)現(xiàn)代碼很簡單,在測試程序中可以看到,當(dāng)我們要?jiǎng)?chuàng)建一組對(duì)象(ProductA1,ProductA2)的時(shí)候我們只用維護(hù)一個(gè)創(chuàng)建對(duì)象(ConcreteFactory1),大大簡化了維護(hù)的成本和工作。
2.4 討論
AbstractFactory模式和Factory模式的區(qū)別是初學(xué)(使用)設(shè)計(jì)模式時(shí)候的一個(gè)容易引起困惑的地方。實(shí)際上,AbstractFactory模式是為創(chuàng)建一組(有多類)相關(guān)或依賴的對(duì)象提供創(chuàng)建接口,而Factory模式正如我在相應(yīng)的文檔中分析的是為一類對(duì)象提供創(chuàng)建接口或延遲對(duì)象的創(chuàng)建到子類中實(shí)現(xiàn)。并且可以看到,AbstractFactory模式通常都是使用Factory模式實(shí)現(xiàn)(ConcreteFactory1)。