抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式结构图如下:
下面是用抽象工厂模式写的一段代码:
#include <iostream>
using namespace std ;
class Apple_phone //苹果手机类
{
public:
virtual void Product(){} ; //生产
virtual void Sell(){} ; //销售
};
class IPhonese : public Apple_phone //IPhonese类
{
public:
void Product() //生产方式
{
cout<<"生产了一部IPhonese手机"<<endl ;
}
void Sell() //销售方式
{
cout<<"销售出去一部IPhonese手机"<<endl ;
}
};
class IPhone6s : public Apple_phone //IPhone5s类
{
public:
void Product()
{
cout<<"生产了一部IPhone6s手机"<<endl ;
}
void Sell()
{
cout<<"销售出去一部IPhone6s手机"<<endl ;
}
};
class HuaWei_phone //华为手机类
{
public:
virtual void Product(){} ; //生产
virtual void Sell(){} ; //销售
};
class Mate8 : public HuaWei_phone //华为Mate8类
{
public:
void Product() //生产方式
{
cout<<"生产了一部Mate8手机"<<endl ;
}
void Sell() //销售方式
{
cout<<"销售出去一部Mate8手机"<<endl ;
}
};
class Mate9 : public HuaWei_phone //华为Mate9类
{
public:
void Product()
{
cout<<"生产了一部Mate9手机"<<endl ;
}
void Sell()
{
cout<<"销售出去一部Mate9手机"<<endl ;
}
};
class Industry //工厂类基类
{
public:
virtual Apple_phone* Product_Apple(){} ; //生产苹果手机系列
virtual HuaWei_phone* Product_HuaWei(){} ; //生产华为手机系列
};
class China_Industry : public Industry //中国区工厂
{
public:
Apple_phone * Product_Apple() //生产苹果手机系列
{
return (new IPhone6s) ;
}
HuaWei_phone * Product_HuaWei() //生产华为手机系列
{
return (new Mate9) ;
}
};
class Germany_Industry : public Industry //德国区工厂
{
public:
Apple_phone * Product_Apple() //生产苹果手机系列
{
return (new IPhonese) ;
}
HuaWei_phone * Product_HuaWei() //生产华为手机系列
{
return (new Mate8) ;
}
};
int main()
{
Industry * pChina = new China_Industry ; //工厂基类指针指向中国区工厂类
Apple_phone * pIPhone6s = pChina->Product_Apple(); //生产IPhone6s
pIPhone6s->Product() ;
pIPhone6s->Sell() ;
cout<<endl ;
HuaWei_phone * pMate9 = pChina->Product_HuaWei() ; //生产Mate9
pMate9->Product() ;
pMate9->Sell() ;
cout<<endl ;
Industry * pGermany = new Germany_Industry ; //工厂基类指针指向德国区工厂类
Apple_phone * pIPhonese = pGermany->Product_Apple(); //生产IPhonese
pIPhonese->Product() ;
pIPhonese->Sell() ;
cout<<endl ;
HuaWei_phone * pMate8 = pGermany->Product_HuaWei() ; //生产Mate8
pMate8->Product() ;
pMate8->Sell() ;
return 0 ;
}
运行后: