//提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类
产品族和产品等级
①产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构,功能相关联的产品组成的家族。如,AMD的主板、芯片组、CPU组成一个家族,Intel的主板、芯片组、CPU组成一个家族。
②产品等级结构:产品等级结构即产品的继承结构。如抽象电视机与具体品牌的电视机之间构成了一个产品等级结构。如,AMD和Intel这两个家族都来自于三个产品等级:主板、芯片组、CPU。一个等级结构是由相同的结构的产品组成。
电脑装机方案
//创建型模式:抽象工厂模式
//电脑组装
产品(等级)
//产品等级1:
class CAbsCPU{
public:
virtual void CalcAndCtrl() = 0;
};
class CIBMCPU : public CAbsCPU{
private:
int iPints;//CPU针脚数
public:
CIBMCPU(int pints);
void CalcAndCtrl();
};
class CIntelCPU : public CAbsCPU{
private:
int iPints;//CPU针脚数
public:
CIntelCPU(int pints);
void CalcAndCtrl();
};
//产品等级2
class CAbsMainboard{
public:
virtual void InstallCPU() = 0;
};
class DPDLL_API CIBMMainboard : public CAbsMainboard{
private:
int iHoles;//CPU插槽的孔数
public:
CIBMMainboard(int holes);
void InstallCPU();
};
class CIntelMainBoard : public CAbsMainboard{
private:
int iHoles;//CPU插槽的孔数
public:
CIntelMainBoard(int holes);
void InstallCPU();
};
工厂类
//3.抽象工厂接口,声明创建抽象产品对象的操作
class CAbsComputerFac{
public:
virtual CAbsCPU* GetCPU() = 0; //创建CPU对象
virtual CAbsMainboard* GetMainboard() = 0;//创建主板对象
};
//3.1具体工厂(装机方案1)
class CIBMFac : public CAbsComputerFac{
public:
CAbsCPU* GetCPU();
CAbsMainboard* GetMainboard();
};
//3.2具体工厂(装机方案2)
class CIntelFac : public CAbsComputerFac{
public:
CAbsCPU* GetCPU();
CAbsMainboard* GetMainboard();
};
产品(等级)
//产品等级1:
CIBMCPU::CIBMCPU(int pints) : iPints(pints){}
void CIBMCPU::CalcAndCtrl(){ cout << "CPUType : IBM, CPUPints : " << iPints << endl;}
CIntelCPU::CIntelCPU(int pints) : iPints(pints){}
void CIntelCPU::CalcAndCtrl(){ cout << "CPUType : Intel, CPUPints : " << iPints << endl;}
//产品等级2
CIBMMainboard::CIBMMainboard(int holes) : iHoles(holes){}
void CIBMMainboard::InstallCPU() { cout << "MainboardType : IBM, MainboardHoles : " << iHoles << endl;}
CIntelMainBoard::CIntelMainBoard(int holes) : iHoles(holes){}
void CIntelMainBoard::InstallCPU(){ cout << "MainboardType : Intel, MainboardHoles : " << iHoles << endl;}
工厂类
//3.抽象工厂接口,声明创建抽象产品对象的操作
//3.1具体工厂(装机方案1)
CAbsCPU* CIBMFac::GetCPU(){return new CIBMCPU(1156);}
CAbsMainboard* CIBMFac::GetMainboard(){return new CIBMMainboard(1156);}
//3.2具体工厂(装机方案2)
CAbsCPU* CIntelFac::GetCPU(){return new CIntelCPU(939);}
CAbsMainboard* CIntelFac::GetMainboard(){return new CIntelMainBoard(939);}
//客户端调用例子
void main()
{
工厂
CAbsComputerFac* pFac = new CIntelFac();
CAbsCPU* pCPU = pFac->GetCPU();//CPU
CAbsMainboard* pMainboard = pFac->GetMainboard();//主板
if(pCPU != NULL && pMainboard != NULL){
//测试一下配件是否正常
pCPU->CalcAndCtrl();
pMainboard->InstallCPU();
delete pCPU;
delete pMainboard;
}
delete pFac;
}