篇三:“抽象工厂模式:构建产品族”
开始本篇文章之前先推荐一个好用的学习工具,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 <iostream>
class ConcreteProductA1 : public AbstractProductA {
public:
void operationA() override {
std::cout << "ConcreteProductA1 operationA" << std::endl;
}
};
// ConcreteProductA2.h
#include "AbstractProductA.h"
#include <iostream>
class ConcreteProductA2 : public AbstractProductA {
public:
void operationA() override {
std::cout << "ConcreteProductA2 operationA" << std::endl;
}
};
// ConcreteProductB1.h
#include "AbstractProductB.h"
#include <iostream>
class ConcreteProductB1 : public AbstractProductB {
public:
void operationB() override {
std::cout << "ConcreteProductB1 operationB" << std::endl;
}
};
// ConcreteProductB2.h
#include "AbstractProductB.h"
#include <iostream>
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++中的应用和原理。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您更深入地学习和应用设计模式。
参考文献:
- Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
- C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/