-
抽象工厂模式:一种创建型设计模式
-
应用场景:
在工厂方法模式之上,考虑到每一种产品就要有一个工厂,产品扩展种类时会增加大量的类,难于管理,对一种情景提出了抽象工厂模式:原本生产木桌和木椅的工厂,要增加铁桌和铁椅这两种产品种类。
如果使用工厂方法模式,则需要在原本两个工厂的基础上,再增加两个工厂。
而此时可以将一个工厂定位为木质工厂,另一个工厂为铁质工厂,两个工厂分别都有桌和椅两条生产线。 -
实现方式:
在工厂方法模式的工厂抽象类中增加生产产品的接口,并在工厂实现类中实现具体的生产操作。 -
优点:
便于扩展已有产品的系列。 -
缺点:
增加新的产品类型时(已有桌、椅,要增加门),需要修改所有工厂。
以下是抽象工厂模式的简易代码实现
// AbstractFactory.hpp
#include <iostream>
using namespace std;
// 产品A抽象类
class Desk {
public:
virtual void Show() = 0;
};
// 产品B抽象类
class Chair {
public:
virtual void Show() = 0;
};
class WoodDesk: public Desk {
public:
void Show() {
cout << "WoodDesk" << endl;
}
};
class IronDesk: public Desk {
public:
void Show() {
cout << "IronDesk" << endl;
}
};
class WoodChair: public Chair {
public:
void Show() {
cout << "WoodChair" << endl;
}
};
class IronChair: public Chair {
public:
void Show() {
cout << "IronChair" << endl;
}
};
// 工厂抽象类
class Factory {
public:
virtual Desk* CreateDesk() = 0;
virtual Chair* CreateChair() = 0;
};
// 生产木质产品的工厂
class WoodFactory: public Factory {
public:
Desk* CreateDesk() {
return new WoodDesk();
}
Chair* CreateChair() {
return new WoodChair();
}
};
// 生产铁质产品的工厂
class IronFactory: public Factory {
public:
Desk* CreateDesk() {
return new IronDesk();
}
Chair* CreateChair() {
return new IronChair();
}
};
主函数中的使用
#include "AbstractFactory.hpp"
int main()
{
Factory* FactoryWood = new WoodFactory();
// 木工厂生产木桌
Desk* DeskWood = FactoryWood->CreateDesk();
DeskWood->Show();
Factory* FactoryIron = new IronFactory();
// 铁工厂生产铁椅
Chair* ChairIron = FactoryIron->CreateChair();
ChairIron->Show();
if (NULL != FactoryWood) {
delete FactoryWood;
FactoryWood = NULL;
}
if (NULL != FactoryIron) {
delete FactoryIron;
FactoryIron = NULL;
}
return 0;
}
控制台输出结果
WoodDesk
IronChair
网友评论