C++设计模式7——抽象工厂(AbstractFactory)模式
1. 抽象工厂(AbstractFactory)模式介绍
定义:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
使用条件:
- 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
- 系统一次只可能消费其中某一族产品,即同族的产品一起使用。
模式的结构:
抽象工厂模式的主要角色如下。
- 抽象工厂(Abstract Factory)
:提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。 - 具体工厂(Concrete Factory)
:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。 - 抽象产品(Product)
:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。 - 具体产品(ConcreteProduct)
:实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
类图:
2. 为方便理解,举个例子
各个国家工厂创建各个国家的水果
#include<iostream>
using namespace std;
class Fruit{
public:
virtual void getName()=0;
};
//下面两个类是一个产品族
class ChinaApple:public Fruit{
public:
virtual void getName(){
cout<<"chinaApple"<<endl;
}
};
class ChinaBanana:public Fruit{
public:
virtual void getName(){
cout<<"ChinaBanana"<<endl;
}
};
//下面两个类是一个产品族
class USAApple:public Fruit{
public:
virtual void getName(){
cout<<"USAApple"<<endl;
}
};
class USABanana:public Fruit{
public:
virtual void getName(){
cout<<"USABanana"<<endl;
}
};
//抽象的工厂(根据产品族进行生产)
class AbstractFactory{
public:
//苹果的生产器
virtual Fruit*createApple()=0;
//香蕉的生产器
virtual Fruit*createBanana()=0;
};
//中国的工厂(虚函数都要实现,哪怕你不用)
class ChinaFactory:public AbstractFactory{
public:
//苹果的生产器
virtual Fruit* createApple(){
return new ChinaApple;
}
//香蕉的生产器
virtual Fruit* createBanana(){
return new ChinaBanana;
}
};
//美国的工厂
class USAFactory:public AbstractFactory{
public:
//苹果的生产器
virtual Fruit* createApple(){
return new USAApple;
}
//香蕉的生产器
virtual Fruit* createBanana(){
return new USABanana;
}
};
int main(){
//中国的系列产品
//利用一个对象生成统一产品族的商品
AbstractFactory *chinaFactory= new ChinaFactory;
Fruit *c_apple=chinaFactory->createApple();
c_apple->getName();
Fruit *c_banana=chinaFactory->createBanana();
c_banana->getName();
//要一个混合的产品,中国的苹果和美国的香蕉
//跨产品族的,创建的工厂类就和普通工厂类相同
AbstractFactory *useFactory= new USAFactory;
Fruit *u_banana=useFactory->createBanana();
u_banana->getName();
return 0;
}
3. 抽象工厂(AbstractFactory)模式优缺点
主要优点如下:
- 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
- 当增加一个新的产品族时不需要修改原代码,满足开闭原则。
其缺点是:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
4. 工厂方法模式和抽象工厂模式的应用场景
- 工厂模式——工厂数量和产品数量一样多——适用于产品数量相对一般的情况
- 抽象的工厂模式——目的是在一定的条件下,减少工厂的个数