C++设计模式之工厂模式(下)——抽象工厂模式

抽象工厂模式

介绍

抽象工厂模式是一种创建型设计模式,它提供了一种封装一组相关或相互依赖对象的方式,而无需指定它们具体的类。它允许客户端使用抽象接口来创建一系列相关的对象,而不必关心其实际的实现细节。

在抽象工厂模式中,存在一个抽象工厂类,该类定义了一组创建对象的方法,这些方法可以创建一系列相关的对象,包括产品对象和工厂对象。由于这些对象都是通过一个抽象接口来创建的,因此它们的具体实现可以被隐藏在实际工厂类的后面。客户端只需要使用抽象工厂类来创建对象,而无需关心它们的实际实现。(理解这个很重要,就是多态的应用)

通过使用抽象工厂模式,我们可以实现高层模块的隔离和解耦,从而使系统更加灵活和可扩展。它还具有高度的封装性,可以隐藏底层实现细节,提高系统的安全性和稳定性。但是它的缺点是增加了系统的复杂性,需要定义更多的抽象类和接口,会增加系统的开发和维护的难度。

示例

这里依旧在之前两篇工厂模式的基础之上,进行改进。

这里客户需要工厂生产塑料的笔筒和铁制笔筒,另外还想生产塑料剑和铁制的剑。

下面是示例代码:

cpp 复制代码
class Sword //剑
{
public:
	virtual void play() = 0;
};

class PlasticSword :public Sword //塑料剑
{
public:
	void play()override 
	{
		cout << "塑料剑舞动!!" << endl;
	}
};

class IronSword :public Sword //铁制剑
{
public:
	void play()override 
	{
		cout << "铁制剑舞动!!" << endl;
	}
};

class AbstractFactory 
{
public:
	virtual PenHolder* createPenHolder() = 0;
	virtual Sword* createSword() = 0;
};

class ProductPlasticFactory :public AbstractFactory 
{
public:
	PenHolder *createPenHolder()override 
	{
		return new PlasticPenHolder;
	}

	Sword* createSword()override 
	{
		return new PlasticSword;
	}
};

class ProductIronFactory :public AbstractFactory 
{
public:
	PenHolder* createPenHolder()override 
	{
		return new IronPenHolder;
	}

	Sword* createSword()override 
	{
		return new IronSword;
	}
};

示例使用

cpp 复制代码
int main() 
{
	AbstractFactory *factory1 = new ProductPlasticFactory;
	PenHolder*pen_Holder1= factory1->createPenHolder();
	Sword* sword1 =  factory1->createSword();
	pen_Holder1->introduce();
	sword1->play();
	
	delete factory1;
	delete pen_Holder1;
	delete sword1;
	
	AbstractFactory *factory2 = new ProductIronFactory;
	PenHolder* pen_Holder2 = factory2->createPenHolder();
	Sword* sword2 = factory2->createSword();
	pen_Holder2->introduce();
	sword2->play();
	
	delete factory2;
	delete pen_Holder2;
	delete sword2;
	
	return 0;
}

运行结果

抽象工厂模式的优缺点

优点

1.分离接口和实现:客户端代码只需要使用抽象工厂和抽象产品,不需要关注具体实现,降低了客户端与具体实现的耦合度,提高了代码的可维护性和可扩展性。

2.符合开闭原则:通过增加具体工厂和具体产品的实现,可以增加新的功能和新的产品,而不需要修改代码。(这里只是针对现有的产品种类而言,随着新产品的增加,需要修改抽象工厂的接口,继而也需要修改子工厂的接口,这样就破坏了开放封闭原则。)

3.保持一致性:抽象工厂模式可以保证一组产品的一致性,使得它们在逻辑上或者物理上都相互配合,满足一定的约束条件。

缺点

1.增加复杂度:引入抽象工厂和多个抽象产品的层次结构,增加了系统的复杂度,增加了开发难度。

2.不易扩展:一旦增加了一个新的产品族,就需要修改抽象工厂和所有的具体工厂和产品,对系统的维护和扩展带来了一定的困难。

3.限制产品族内的产品等级结构:由于抽象工厂只定义了一组产品的创建接口,因此它限制了具体产品等级结构的扩展,只能在产品族内扩展产品。

总结

抽象工厂设计模式确实很抽象,所以需要慢慢领悟,多悟几次,然后再后期的开发中就可以融进自己的项目中,提高程序的封装性,安全性,但复杂性也随之增加。

相关推荐
AC赳赳老秦13 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
无名猿13 小时前
C++ 查找算法:std::find 与容器成员 find 的性能差距
c++·性能优化·stl·标准库
程序猿编码14 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎
朝朝辞暮i15 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
SHARK_pssm16 小时前
【C++——类和对象(下)】
开发语言·c++·经验分享·笔记
汉克老师16 小时前
GESP2026年9月认证C++二级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
沫璃染墨17 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
可乐ea18 小时前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
朝朝辞暮i18 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
无忧.芙桃20 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法