简介
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
它属于工厂模式的一种,与工厂方法模式相比,抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而工厂方法模式只能创建单一产品。
在抽象工厂模式中,有一个抽象工厂类,它定义了一组用于创建一系列产品的接口。
描述
抽象工厂模式通过抽象工厂类和具体工厂类之间的继承关系来实现,在抽象工厂类中定义了用于创建一系列产品的接口,而具体工厂类则实现了这些接口,从而具体创建了一系列相互依赖的产品。每个具体工厂类只能创建一批相关的产品,这些产品组成了一个产品族。在客户端代码中只需要调用抽象工厂类的方法,即可创建一组相关的产品。
原理
抽象工厂模式的关键是抽象工厂类,它定义了一系列用于创建一组相关产品的方法,在客户端代码中只需要使用抽象工厂类来实现具体的产品创建,而无需关心每个产品的具体实现。具体工厂类则实现了抽象工厂类中定义的方法,从而创建一组相互依赖的产品。
示例
以生产不同系列的电视和空调为例,首先定义一个抽象产品类TV和AbstractAirConditioner,具体产品类SonyTV、SamsungTV、SonyAirConditioner和SamsungAirConditioner继承这些抽象类。
之后定义一个抽象工厂类AbstractFactory,其中含有创建TV和AirConditioner的接口。
具体工厂类SonyFactory和SamsungFactory实现这个接口来创建这些具体的产品。
客户端代码中只需使用这些具体的工厂类调用AbstractFactory的方法来创建不同系列的产品。
#include <iostream>
using namespace std;
// 抽象产品类
class TV {
public:
virtual void play() = 0;
};
class AbstractAirConditioner {
public:
virtual void cool() = 0;
};
// 具体产品类
class SonyTV : public TV {
public:
void play() {
cout << "Sony TV is playing." << endl;
}
};
class SamsungTV : public TV {
public:
void play() {
cout << "Samsung TV is playing." << endl;
}
};
class SonyAirConditioner : public AbstractAirConditioner {
public:
void cool() {
cout << "Sony air conditioner is cooling." << endl;
}
};
class SamsungAirConditioner : public AbstractAirConditioner {
public:
void cool() {
cout << "Samsung air conditioner is cooling." << endl;
}
};
// 抽象工厂类
class AbstractFactory {
public:
virtual TV* createTV() = 0;
virtual AbstractAirConditioner* createAirConditioner() = 0;
};
// 具体工厂类
class SonyFactory : public AbstractFactory {
public:
TV* createTV() {
return new SonyTV();
}
AbstractAirConditioner* createAirConditioner() {
return new SonyAirConditioner();
}
};
class SamsungFactory : public AbstractFactory {
public:
TV* createTV() {
return new SamsungTV();
}
AbstractAirConditioner* createAirConditioner() {
return new SamsungAirConditioner();
}
};
// 客户端代码
int main() {
AbstractFactory* factory = new SonyFactory();
TV* tv = factory->createTV();
AbstractAirConditioner* ac = factory->createAirConditioner();
tv->play();
ac->cool();
delete tv;
delete ac;
factory = new SamsungFactory();
tv = factory->createTV();
ac = factory->createAirConditioner();
tv->play();
ac->cool();
delete tv;
delete ac;
delete factory;
return 0;
}
输出结果
Sony TV is playing.
Sony air conditioner is cooling.
Samsung TV is playing.
Samsung air conditioner is cooling.
结论
抽象工厂模式是一种创建一系列相互依赖的产品的设计模式,它通过抽象工厂类和具体工厂类之间的继承关系来实现。它使得客户端代码只需使用抽象工厂类的方法来创建产品,而无需关心每个产品的具体实现。抽象工厂模式适用于一系列相关或相互依赖的产品的创建,同时它具有良好的扩展性,可以方便地扩展新的产品系列。