抽象工厂模式
场景
在工厂模式中,一个工厂只能生产出一类产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法。但是我们有时需要一个工厂能提供多类产品对象。这时就需要使用抽象工厂模式。
定义
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
结构
抽象工厂模式其实就是工厂模式的升级。他的基本结构和工厂模式相同:
- Factory(抽象工厂):声明一个用于创建抽象产品的接口。
- ConcreteFactory(具体工厂):用于创建具体的产品。
- Product(抽象产品):声明一个产品对象类型的接口。
- ConcreteProduct(具体产品):由具体工厂创建的具体产品。
不同的地方在于抽象工厂类中提供了多个产品接口,这样工厂就能支持多个不同类型的产品创建。
实现
我们继续以工厂模式中的MCDonald套餐为例,不过这次我们加入了KFC套餐:
Product:
class McDonald{
public:
virtual std::string Package() = 0;
};
class KFC{
public:
virtual std::string Package() = 0;
};
ConcreteProduct:
/******McDonald******/
class MFiredChicken : public McDonald{
public:
std::string Package(){
return "MFiredChicken";
}
};
class MBurger : public McDonald{
public:
std::string Package(){
return "MBurger";
}
};
class MDessert : public McDonald{
public:
std::string Package(){
return "MDessert";
}
};
/*******KFC*******/
class KFiredChicken : public KFC{
public:
std::string Package(){
return "KFiredChicken";
}
};
class KBurger : public KFC{
public:
std::string Package(){
return "KBurger";
}
};
class KDessert : public KFC{
public:
std::string Package(){
return "KDessert";
}
};
factory:
class Factory{
public:
virtual McDonald* CreateMcPackage() = 0;
virtual KFC* CreateKFCPackage() = 0;
};
ConcreteFactory:
class FiredChickenFactory : public Factory{
public:
McDonald* CreateMcPackage(){
return new MFiredChicken();
}
KFC* CreateKFCPackage(){
return new KFiredChicken();
}
};
class BurgerFactory : public Factory{
public:
McDonald* CreateMcPackage(){
return new MBurger();
}
KFC* CreateKFCPackage(){
return new KBurger();
}
};
class DessertFactory : public Factory{
public:
McDonald* CreateMcPackage(){
return new MDessert();
}
KFC* CreateKFCPackage(){
return new KDessert();
}
};
main:
int main(){
Factory* pFactory = new DessertFactory();
McDonald* pMcDonald = pFactory->CreateMcPackage();
KFC* pKFC = pFactory->CreateKFCPackage();
std::cout << pMcDonald->Package() << std::endl;
std::cout << pKFC->Package() << std::endl;
}