基本概念:
抽象工厂模式是一种创建型设计模式,封装了一组相关或依赖的对象的创建逻辑,而不需要指定具体的类。
使用抽象工厂模式,客户端可以创建一系列相关的对象,而无需关心这些对象的具体实现细节,从而实现了对象的创建和使用的解耦。
抽象工厂模式需要实现以下类:
- 抽象工厂(Abstract Factory):定义了创建一系列相关对象的接口。
- 具体工厂(Concrete Factory):实现了抽象工厂定义的接口,负责创建一系列相关的具体对象。
- 抽象产品(Abstract Product):定义了一系列相关对象的接口。
- 具体产品(Concrete Product):实现了抽象产品定义的接口,是一系列相关对象的具体实现。
使用场景:
-
当需要一次性创建一组相关的对象,而这些对象之间存在着某种关联或依赖关系时。
-
当系统需要支持多个产品族,并且希望客户端能够灵活地选择和切换不同的产品族时。
-
对象的创建和使用需要解耦时。
实现:
// 抽象产品A
class AbstractProductA {
public:
virtual void operationA() const = 0;
};
// 具体产品A 1
class ConcreteProductA1 : public AbstractProductA {
public:
void operationA() const override {
// 具体产品 A1 的操作
}
};
// 具体产品A 2
class ConcreteProductA2 : public AbstractProductA {
public:
void operationA() const override {
// 具体产品 A2 的操作
}
};
// 抽象产品B
class AbstractProductB {
public:
virtual void operationB() const = 0;
};
// 具体产品B 1
class ConcreteProductB1 : public AbstractProductB {
public:
void operationB() const override {
// 具体产品 B1 的操作
}
};
// 具体产品B 2
class ConcreteProductB2 : public AbstractProductB {
public:
void operationB() const override {
// 具体产品 B2 的操作
}
};
// 抽象工厂
class AbstractFactory {
public:
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};
// 具体工厂 1
class ConcreteFactory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA1();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB1();
}
};
// 具体工厂 2
class ConcreteFactory2 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA2();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB2();
}
};
QT的模型类
QT的模型类的实现也体现了抽象工厂模式。
-
抽象工厂(Abstract Factory) :例如
QAbstractItemModel
、QAbstractListModel
、QAbstractTableModel
等。这些抽象类定义了一组接口,用于创建模型类的实例。 -
具体工厂(Concrete Factory) :例如
QStandardItemModel
、QSqlQueryModel
、QFileSystemModel
等,它们实现了QAbstractItemModel
接口,并负责创建具体的模型对象。 -
抽象产品(Abstract Product) :抽象产品可以是模型类中定义的接口和纯虚函数,例如
data()
、setData()
、rowCount()
、columnCount()
等。 -
具体产品(Concrete Product) :。在 Qt 中,具体产品可以是继承自抽象模型类的具体模型类,例如
QStandardItemModel
、QSqlQueryModel
、QFileSystemModel
等。