篇三:“抽象工厂模式:构建产品族”
开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。
另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d
设计模式是软件开发中的重要组成部分,抽象工厂模式是创建型设计模式中的一种。抽象工厂模式旨在提供一个接口,用于创建一组相关或相互依赖的对象,从而构建产品族。在C++中,抽象工厂模式常用于需要创建一系列相关对象的场景,让我们一起深入了解其原理、适用场景,并通过示例代码实现抽象工厂模式。
1. 抽象工厂模式的原理和适用场景:
抽象工厂模式是创建型设计模式,它旨在提供一个接口(抽象工厂),用于创建一组相关或相互依赖的对象,构建产品族。在抽象工厂模式中,每个具体工厂类负责创建一组具体产品类的实例,而客户端代码只与抽象工厂和抽象产品类打交道,无需直接创建具体产品类的实例。
抽象工厂模式适用于以下场景:
2. C++中实现抽象工厂模式的示例代码:
在C++中,可以使用虚函数和抽象类来定义抽象工厂接口和抽象产品类,然后由具体工厂子类来实现工厂接口,根据需要返回相应的产品类的实例。
a. 定义抽象产品类:
// AbstractProductA.h
class AbstractProductA {
public:
virtual ~AbstractProductA() {}
virtual void operationA() = 0;
};
// AbstractProductB.h
class AbstractProductB {
public:
virtual ~AbstractProductB() {}
virtual void operationB() = 0;
};
b. 定义抽象工厂类:
// AbstractFactory.h
#include "AbstractProductA.h"
#include "AbstractProductB.h"
class AbstractFactory {
public:
virtual ~AbstractFactory() {}
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};
c. 定义具体产品类:
// ConcreteProductA1.h
#include "AbstractProductA.h"
#include
class ConcreteProductA1 : public AbstractProductA {
public:
void operationA() override {
std::cout << "ConcreteProductA1 operationA" << std::endl;
}
};
// ConcreteProductA2.h
#include "AbstractProductA.h"
#include
class ConcreteProductA2 : public AbstractProductA {
public:
void operationA() override {
std::cout << "ConcreteProductA2 operationA" << std::endl;
}
};
// ConcreteProductB1.h
#include "AbstractProductB.h"
#include
class ConcreteProductB1 : public AbstractProductB {
public:
void operationB() override {
std::cout << "ConcreteProductB1 operationB" << std::endl;
}
};
// ConcreteProductB2.h
#include "AbstractProductB.h"
#include
class ConcreteProductB2 : public AbstractProductB {
public:
void operationB() override {
std::cout << "ConcreteProductB2 operationB" << std::endl;
}
};
d. 定义具体工厂类:
// ConcreteFactory1.h
#include "AbstractFactory.h"
#include "ConcreteProductA1.h"
#include "ConcreteProductB1.h"
class ConcreteFactory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA1();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB1();
}
};
// ConcreteFactory2.h
#include "AbstractFactory.h"
#include "ConcreteProductA2.h"
#include "ConcreteProductB2.h"
class ConcreteFactory2 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ConcreteProductA2();
}
AbstractProductB* createProductB() override {
return new ConcreteProductB2();
}
};
e. 使用抽象工厂模式:
// main.cpp
#include "AbstractFactory.h"
#include "ConcreteFactory1.h"
#include "ConcreteFactory2.h"
void client
// client.cpp
void client(AbstractFactory* factory) {
AbstractProductA* productA = factory->createProductA();
AbstractProductB* productB = factory->createProductB();
productA->operationA();
productB->operationB();
delete productA;
delete productB;
}
int main() {
AbstractFactory* factory1 = new ConcreteFactory1();
AbstractFactory* factory2 = new ConcreteFactory2();
// 使用工厂1创建产品A和产品B
std::cout << "Using Factory 1:" << std::endl;
client(factory1);
// 使用工厂2创建产品A和产品B
std::cout << "Using Factory 2:" << std::endl;
client(factory2);
delete factory1;
delete factory2;
return 0;
}
在上述示例中,我们定义了抽象产品类AbstractProductA
和AbstractProductB
,以及抽象工厂类AbstractFactory
。然后,我们定义了具体产品类ConcreteProductA1
、ConcreteProductA2
、ConcreteProductB1
和ConcreteProductB2
,并分别由具体工厂类ConcreteFactory1
和ConcreteFactory2
负责创建。
客户端代码通过接收抽象工厂类指针,可以使用不同的具体工厂来创建一组产品,构建产品族。在示例中,我们使用工厂1创建产品A1和产品B1,使用工厂2创建产品A2和产品B2。
3. 抽象工厂模式的代码解析:
4. 总结:
抽象工厂模式是创建型设计模式,用于构建产品族。在C++中,通过定义抽象工厂接口和抽象产品类,然后由具体工厂子类来实现工厂接口,从而实现了对象创建与使用的分离。抽象工厂模式提供了一种灵活的方式来构建一组相关的对象,使得系统更加灵活和易于维护。
希望本文能够帮助您更好地理解抽象工厂模式在C++中的应用和原理。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您更深入地学习和应用设计模式。
参考文献:
感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/