問題的提出
從前面我們已經(jīng)使用了工廠方法模式 解決了一些問題。
現(xiàn)在 策劃又提出了新的需求:對于各個怪物,在不同的場景下,怪物的面板數(shù)值會發(fā)生變化,
?? ?//怪物分類:亡靈類,元素類,機(jī)械類
?? ?//戰(zhàn)斗場景分類:沼澤地區(qū),山脈地區(qū),城鎮(zhèn)。
那么就有9類怪物====>沼澤地亡靈類、元素類、機(jī)械類,山脈地區(qū)亡靈類、元素類、機(jī)械類,城鎮(zhèn)中的亡靈類、元素類、機(jī)械類
?? ?//工廠方法模式:一個工廠創(chuàng)建一種類怪物。我們就要創(chuàng)建9個工廠了。
抽象模式的核心思想
?? ?//但如果一個工廠子類能夠創(chuàng)建不止一種而是多種具有相同規(guī)則的怪物對象,那么就可以有效的減少所創(chuàng)建的工廠子類數(shù)量,這就是抽象工廠模式的核心思想。
?
兩個概念:a)產(chǎn)品等級結(jié)構(gòu) ? b)產(chǎn)品族
在這里,我們先要弄清楚 兩個概念:a)產(chǎn)品等級結(jié)構(gòu) ? b)產(chǎn)品族
?? ?//抽象工廠模式是按照產(chǎn)品族來生產(chǎn)產(chǎn)品(產(chǎn)地相同的用一個工廠來生產(chǎn))——一個地點(diǎn)有一個工廠,該工廠負(fù)責(zé)生產(chǎn)本產(chǎn)地的所有產(chǎn)品。
?
代碼實(shí)現(xiàn)
第一步:肯定是先將9個類先弄出來
第二步:第二步,定義一個抽象工廠類
?? ?//所有工廠類的父類
第三步:具體沼澤地區(qū)的工廠
#include <iostream>
using namespace std;
namespace _namespace1 {
//第一步,定義9個怪物和其父類
//怪物父類
class Monster
{
public:
//構(gòu)造函數(shù)
Monster(int life, int magic, int attack) :m_life(life), m_magic(magic), m_attack(attack) {}
virtual ~Monster() {} //做父類時析構(gòu)函數(shù)應(yīng)該為虛函數(shù)
protected://可能被子類訪問的成員,所以用protected修飾
//怪物屬性
int m_life; //生命值
int m_magic; //魔法值
int m_attack; //攻擊力
};
//沼澤亡靈類怪物
class M_Undead_Swamp :public Monster
{
public:
M_Undead_Swamp(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個沼澤的亡靈類怪物來到了這個世界" << endl;
}
};
//沼澤元素類怪物
class M_Element_Swamp :public Monster
{
public:
M_Element_Swamp(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個沼澤的元素類怪物來到了這個世界" << endl;
}
};
//沼澤機(jī)械類怪物
class M_Mechanic_Swamp :public Monster
{
public:
M_Mechanic_Swamp(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個沼澤的機(jī)械類怪物來到了這個世界" << endl;
}
};
//--------------------------
//山脈亡靈類怪物
class M_Undead_Mountain :public Monster
{
public:
M_Undead_Mountain(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個山脈的亡靈類怪物來到了這個世界" << endl;
}
};
//山脈元素類怪物
class M_Element_Mountain :public Monster
{
public:
M_Element_Mountain(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個山脈的元素類怪物來到了這個世界" << endl;
}
};
//山脈機(jī)械類怪物
class M_Mechanic_Mountain :public Monster
{
public:
M_Mechanic_Mountain(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個山脈的機(jī)械類怪物來到了這個世界" << endl;
}
};
//--------------------------
//城鎮(zhèn)亡靈類怪物
class M_Undead_Town :public Monster
{
public:
M_Undead_Town(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個城鎮(zhèn)的亡靈類怪物來到了這個世界" << endl;
}
};
//城鎮(zhèn)元素類怪物
class M_Element_Town :public Monster
{
public:
M_Element_Town(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個城鎮(zhèn)的元素類怪物來到了這個世界" << endl;
}
};
//城鎮(zhèn)機(jī)械類怪物
class M_Mechanic_Town :public Monster
{
public:
M_Mechanic_Town(int life, int magic, int attack) :Monster(life, magic, attack)
{
cout << "一個城鎮(zhèn)的機(jī)械類怪物來到了這個世界" << endl;
}
};
//如上已經(jīng)把9個怪物定義出來了
//第二步,定義一個抽象工廠類
//所有工廠類的父類
class M_ParFactory
{
public:
virtual Monster* createMonster_Undead() = 0; //創(chuàng)建亡靈類怪物
virtual Monster* createMonster_Element() = 0; //創(chuàng)建元素類怪物
virtual Monster* createMonster_Mechanic() = 0; //創(chuàng)建機(jī)械類怪物
virtual ~M_ParFactory() {} //做父類時析構(gòu)函數(shù)應(yīng)該為虛函數(shù)
};
//沼澤地區(qū)的工廠
class M_Factory_Swamp :public M_ParFactory
{
public:
virtual Monster* createMonster_Undead()
{
return new M_Undead_Swamp(300, 50, 120); //創(chuàng)建沼澤亡靈類怪物
}
virtual Monster* createMonster_Element()
{
return new M_Element_Swamp(200, 80, 110); //創(chuàng)建沼澤元素類怪物
}
virtual Monster* createMonster_Mechanic()
{
return new M_Mechanic_Swamp(400, 0, 90); //創(chuàng)建沼澤機(jī)械類怪物
}
};
//--------------------------
//山脈地區(qū)的工廠
class M_Factory_Mountain :public M_ParFactory
{
public:
virtual Monster* createMonster_Undead()
{
return new M_Undead_Mountain(300, 50, 80); //創(chuàng)建山脈亡靈類怪物
}
virtual Monster* createMonster_Element()
{
return new M_Element_Mountain(200, 80, 100); //創(chuàng)建山脈元素類怪物
}
virtual Monster* createMonster_Mechanic()
{
return new M_Mechanic_Mountain(600, 0, 110); //創(chuàng)建山脈機(jī)械類怪物
}
};
//--------------------------
//城鎮(zhèn)的工廠
class M_Factory_Town :public M_ParFactory
{
public:
virtual Monster* createMonster_Undead()
{
return new M_Undead_Town(300, 50, 80); //創(chuàng)建城鎮(zhèn)亡靈類怪物
}
virtual Monster* createMonster_Element()
{
return new M_Element_Town(200, 80, 100); //創(chuàng)建城鎮(zhèn)元素類怪物
}
virtual Monster* createMonster_Mechanic()
{
return new M_Mechanic_Town(400, 0, 110); //創(chuàng)建城鎮(zhèn)機(jī)械類怪物
}
};
}
int main() {
_namespace1::M_ParFactory* p_mou_fy = new _namespace1::M_Factory_Mountain(); //多態(tài)工廠,山脈地區(qū)的工廠
_namespace1::Monster* pM1 = p_mou_fy->createMonster_Element(); //創(chuàng)建山脈地區(qū)的元素類怪物
_namespace1::M_ParFactory* p_twn_fy = new _namespace1::M_Factory_Town(); //多態(tài)工廠,城鎮(zhèn)的工廠
_namespace1::Monster* pM2 = p_twn_fy->createMonster_Undead(); //創(chuàng)建城鎮(zhèn)地區(qū)的亡靈類怪物
_namespace1::Monster* pM3 = p_twn_fy->createMonster_Mechanic(); //創(chuàng)建城鎮(zhèn)地區(qū)的機(jī)械類怪物
//釋放資源
//釋放工廠
delete p_mou_fy;
delete p_twn_fy;
delete pM1;
delete pM2;
delete pM3;
return 0;
}
第二個例子:
不同廠商生產(chǎn)不同部件范例
?? ?//芭比娃娃:身體(包括頭、頸部、軀干、四肢)、衣服、鞋子
?? ?//中國,日本,美國 廠商
?? ?//要求:制作兩個芭比娃娃,第一個:身體,衣服,鞋子,全部采用中國廠商制造的部件。
?? ? ? ? ? ? ? ? ? ? ? ? ? ?//第二個:身體采用中國廠商,衣服部件采用日本廠商,鞋子部件采用美國廠商。
?? ?//類的設(shè)計(jì)思路:
?? ?//a)將身體,衣服,鞋子 這三個部件實(shí)現(xiàn)為抽象類。
?? ?//b)實(shí)現(xiàn)一個抽象工廠,分別用來生產(chǎn)身體、衣服、鞋子這三個部件。
?? ?//c)針對不同廠商的每個部件實(shí)現(xiàn)具體的類以及每個廠商所代表的具體工廠。
namespace _nmsp3
{
//身體抽象類
class Body
{
public:
virtual void getName() = 0;
virtual ~Body() {}
};
//衣服抽象類
class Clothes
{
public:
virtual void getName() = 0;
virtual ~Clothes() {}
};
//鞋子抽象類
class Shoes
{
public:
virtual void getName() = 0;
virtual ~Shoes() {}
};
//---------------------------
//抽象工廠類
class AbstractFactory
{
public:
//所創(chuàng)建的部件應(yīng)該穩(wěn)定的保持這三個部件,才適合抽象工廠模式
virtual Body* createBody() = 0; //創(chuàng)建身體
virtual Clothes* createClothes() = 0; //創(chuàng)建衣服
virtual Shoes* createShoes() = 0; //創(chuàng)建鞋子
virtual ~AbstractFactory() {}
};
//---------------------------
//芭比娃娃類
class BarbieDoll
{
public:
//構(gòu)造函數(shù)
BarbieDoll(Body* tmpbody, Clothes* tmpclothes, Shoes* tmpshoes)
{
body = tmpbody;
clothes = tmpclothes;
shoes = tmpshoes;
}
void Assemble() //組裝芭比娃娃
{
cout << "成功組裝了一個芭比娃娃:" << endl;
body->getName();
clothes->getName();
shoes->getName();
}
private:
Body* body;
Clothes* clothes;
Shoes* shoes;
};
//---------------------------
//中國廠商實(shí)現(xiàn)的三個部件
class China_Body :public Body
{
public:
virtual void getName()
{
cout << "中國廠商產(chǎn)的_身體部件" << endl;
}
};
class China_Clothes :public Clothes
{
public:
virtual void getName()
{
cout << "中國廠商產(chǎn)的_衣服部件" << endl;
}
};
class China_Shoes :public Shoes
{
public:
virtual void getName()
{
cout << "中國廠商產(chǎn)的_鞋子部件" << endl;
}
};
//創(chuàng)建一個中國工廠
class ChinaFactory : public AbstractFactory
{
public:
virtual Body* createBody()
{
return new China_Body;
}
virtual Clothes* createClothes()
{
return new China_Clothes;
}
virtual Shoes* createShoes()
{
return new China_Shoes;
}
};
//---------------------------
//日本廠商實(shí)現(xiàn)的三個部件
class Japan_Body :public Body
{
public:
virtual void getName()
{
cout << "日本廠商產(chǎn)的_身體部件" << endl;
}
};
class Japan_Clothes :public Clothes
{
public:
virtual void getName()
{
cout << "日本廠商產(chǎn)的_衣服部件" << endl;
}
};
class Japan_Shoes :public Shoes
{
public:
virtual void getName()
{
cout << "日本廠商產(chǎn)的_鞋子部件" << endl;
}
};
//創(chuàng)建一個日本工廠
class JapanFactory : public AbstractFactory
{
public:
virtual Body* createBody()
{
return new Japan_Body;
}
virtual Clothes* createClothes()
{
return new Japan_Clothes;
}
virtual Shoes* createShoes()
{
return new Japan_Shoes;
}
};
//---------------------------
//美國廠商實(shí)現(xiàn)的三個部件
class America_Body :public Body
{
public:
virtual void getName()
{
cout << "美國廠商產(chǎn)的_身體部件" << endl;
}
};
class America_Clothes :public Clothes
{
public:
virtual void getName()
{
cout << "美國廠商產(chǎn)的_衣服部件" << endl;
}
};
class America_Shoes :public Shoes
{
public:
virtual void getName()
{
cout << "美國廠商產(chǎn)的_鞋子部件" << endl;
}
};
//創(chuàng)建一個美國工廠
class AmericaFactory : public AbstractFactory
{
public:
virtual Body* createBody()
{
return new America_Body;
}
virtual Clothes* createClothes()
{
return new America_Clothes;
}
virtual Shoes* createShoes()
{
return new America_Shoes;
}
};
}
int main() {
//創(chuàng)建第一個芭比娃娃------------
//(1)創(chuàng)建一個中國工廠
_nmsp3::AbstractFactory* pChinaFactory = new _nmsp3::ChinaFactory();
//(2)創(chuàng)建中國產(chǎn)的各種部件
_nmsp3::Body* pChinaBody = pChinaFactory->createBody();
_nmsp3::Clothes* pChinaClothes = pChinaFactory->createClothes();
_nmsp3::Shoes* pChinaShoes = pChinaFactory->createShoes();
//(3)創(chuàng)建芭比娃娃
_nmsp3::BarbieDoll* pbd1obj = new _nmsp3::BarbieDoll(pChinaBody, pChinaClothes, pChinaShoes);
pbd1obj->Assemble(); //組裝芭比娃娃
cout << "-------------------------------------" << endl;
//創(chuàng)建第二個芭比娃娃------------
//(1)創(chuàng)建另外兩個工廠:日本工廠,美國工廠
_nmsp3::AbstractFactory* pJapanFactory = new _nmsp3::JapanFactory();
_nmsp3::AbstractFactory* pAmericaFactory = new _nmsp3::AmericaFactory();
//(2)創(chuàng)建中國產(chǎn)的身體部件,日本產(chǎn)的衣服部件,美國產(chǎn)的鞋子部件
_nmsp3::Body* pChinaBody2 = pChinaFactory->createBody();
_nmsp3::Clothes* pJapanClothes = pJapanFactory->createClothes();
_nmsp3::Shoes* pAmericaShoes = pAmericaFactory->createShoes();
//(3)創(chuàng)建芭比娃娃
_nmsp3::BarbieDoll* pbd2obj = new _nmsp3::BarbieDoll(pChinaBody2, pJapanClothes, pAmericaShoes);
pbd2obj->Assemble(); //組裝芭比娃娃
//最后記得釋放內(nèi)存----------------
delete pbd1obj;
delete pChinaShoes;
delete pChinaClothes;
delete pChinaBody;
delete pChinaFactory;
//------------
delete pbd2obj;
delete pAmericaShoes;
delete pJapanClothes;
delete pChinaBody2;
delete pAmericaFactory;
delete pJapanFactory;
return 0;
}
工廠方法模式 和 抽象工廠模式的區(qū)別
?? ?//工廠方法模式和抽象工廠模式區(qū)別:
?? ?//a)工廠方法模式:一個工廠生產(chǎn)一個產(chǎn)品
?? ?//b)抽象工廠模式:一個工廠生產(chǎn)多個產(chǎn)品(產(chǎn)品族)文章來源:http://www.zghlxwxcb.cn/news/detail-851285.html
?? ?//抽象工廠模式的定義(實(shí)現(xiàn)意圖):提供一個接口(AbstractFactory),
?? ? ? ? ? //讓該接口負(fù)責(zé)創(chuàng)建一系列相關(guān)或者相互依賴的對象(Body,Clothes,Shoes),而無需指定他們具體的類。文章來源地址http://www.zghlxwxcb.cn/news/detail-851285.html
到了這里,關(guān)于C++11 設(shè)計(jì)模式4. 抽象工廠(Abstract Factory)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!