设计模式:抽象工厂模式(Abstract Factory Pattern)详解
创作时间:
作者:
@小白创作中心
设计模式:抽象工厂模式(Abstract Factory Pattern)详解
引用
CSDN
1.
https://blog.csdn.net/Interview_TC/article/details/147028612
抽象工厂模式(Abstract Factory Pattern)是GoF设计模式中的一种创建型模式,主要用于创建一系列相关或相互依赖的对象。它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。这种模式特别适用于需要处理多个产品族的场景,例如跨平台UI组件库的设计。
经过前两天的学习,我们已经掌握了单例模式与工厂方法模式,理解了如何控制实例个数与如何通过子类封装对象的创建逻辑。今天,我们将进一步深入“工厂”体系,学习抽象工厂模式(Abstract Factory Pattern),这是在实际项目中用于创建“产品族”的关键设计模式。
一、Day 1~2 回顾
✅ Day 1:单例模式
- 保证一个类只有一个实例。
- 适合日志系统、配置加载器、数据库连接池等场景。
- 推荐使用 C++11 局部静态变量实现线程安全。
✅ Day 2:工厂方法模式
- 将创建产品的职责下放给子类工厂。
- 满足开闭原则:添加新产品时只需新增具体工厂和产品类。
- 适用于“产品种类多变”的系统结构。
二、抽象工厂模式简介
📌 定义:
抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。关键词:“一系列相关对象” → 产品族
✅ 场景关键词:
- 多个产品类型(如按钮、窗口)
- 同一系列产品(如 Windows 风格、Mac 风格)
- 产品之间存在匹配关系
三、类图结构
+------------------------+
| AbstractFactory |
|------------------------|
| +createButton() |
| +createCheckbox() |
+-----------+------------+
|
+-----------------+-----------------+
| |
+-------------+ +----------------+
| WinFactory | | MacFactory |
+-------------+ +----------------+
| +createButton() | | +createButton() |
| +createCheckbox() | | +createCheckbox()|
产品结构(同理)
+-----------------+ +------------------+
| AbstractButton |<------| WinButton |
| | | MacButton |
+-----------------+ +------------------+
四、C++ 实现:跨平台 UI 工厂
我们来设计一个跨平台 GUI 库,可以根据平台生成不同风格的按钮和复选框。
1. 抽象产品类
class Button {
public:
virtual void paint() = 0;
virtual ~Button() {}
};
class Checkbox {
public:
virtual void paint() = 0;
virtual ~Checkbox() {}
};
2. 具体产品类
class WinButton : public Button {
public:
void paint() override {
std::cout << "绘制 Windows 风格按钮" << std::endl;
}
};
class MacButton : public Button {
public:
void paint() override {
std::cout << "绘制 Mac 风格按钮" << std::endl;
}
};
class WinCheckbox : public Checkbox {
public:
void paint() override {
std::cout << "绘制 Windows 风格复选框" << std::endl;
}
};
class MacCheckbox : public Checkbox {
public:
void paint() override {
std::cout << "绘制 Mac 风格复选框" << std::endl;
}
};
3. 抽象工厂类
class GUIFactory {
public:
virtual Button* createButton() = 0;
virtual Checkbox* createCheckbox() = 0;
virtual ~GUIFactory() {}
};
4. 具体工厂类
class WinFactory : public GUIFactory {
public:
Button* createButton() override {
return new WinButton();
}
Checkbox* createCheckbox() override {
return new WinCheckbox();
}
};
class MacFactory : public GUIFactory {
public:
Button* createButton() override {
return new MacButton();
}
Checkbox* createCheckbox() override {
return new MacCheckbox();
}
};
5. 客户端代码
void render(GUIFactory* factory) {
Button* btn = factory->createButton();
Checkbox* chk = factory->createCheckbox();
btn->paint();
chk->paint();
delete btn;
delete chk;
}
int main() {
WinFactory win;
MacFactory mac;
render(&win);
render(&mac);
return 0;
}
五、优缺点分析
✅ 优点:
- 保证产品族之间的一致性(按钮和复选框风格统一)
- 满足开闭原则,支持新增平台或产品族
- 客户端代码不依赖具体产品类,低耦合
❌ 缺点:
- 类数量增多,结构复杂
- 不方便支持新增“产品种类”(比如再加个菜单类)
六、今日练习题
✍️ 题目一:
设计一个跨平台图标与窗口组件的 UI 系统,要求使用抽象工厂模式构造 Icon 与 Window 两类产品族,支持 Windows 与 Linux 两个平台。
✍️ 题目二:
抽象工厂模式和工厂方法模式的最大区别是什么?请简洁说明并举例。
七、小结与展望
抽象工厂模式适合管理“产品族”,比工厂方法更进一步封装了对象创建的整体体系。掌握它有助于构建可扩展、可复用、风格一致的大型软件系统。
热门推荐
The Game Awards:游戏界的奥斯卡,荣耀与梦想的交汇点!
什么是特发性肺间质纤维化灶
足底筋膜炎的诊断与治疗,看这篇就够了
癌症悄然而至,血常规报告这些异常千万别大意
110㎡黑白棕,法式复古实用家
电脑主板不通电的解决方法(如何解决电脑主板无法正常供电的问题)
湖北大冶深入探索绿色发展之路
如何增强大模型多轮对话指令跟随能力
紫癜病是怎么回事
50张图详解各类模板施工技术
如何用web实现文档输入输出
服务器错误导致上传失败,该如何解决?
东京科学大学发现骨重塑新因子Fam102a,为骨质疏松治疗提供新思路
越是冬天,越不能不去元阳梯田!
什么是茅山道士,茅山道士长啥样
充电桩不接地线问题大吗?
洗衣机不通电怎么办?15步排查法帮你轻松解决故障
王朝1982献唱《哪吒之魔童闹海》片尾态度曲《我乃哪吒三太子》,燃爆国漫新声
白车身焊装生产线如何提升效率
初中毕业干什么职业最吃香?初中毕业,哪条职业路最亮眼?
年夜饭必备硬菜:梅菜扣肉的制作秘籍
菜系大跌,中加贸易关系或将缓和?菜系下跌逻辑梳理
合同被认定无效后有哪些法律后果
2024-25赛季夺冠渺茫的五支球队,詹姆斯夺冠窗口已关闭
世界银行上调高收入国家标准:俄罗斯晋级,巴勒斯坦下跌,中国呢
杭钢股份:钢铁巨轮的"数据蓝海"迷航与资本狂欢下的暗流
无人机制造“大户”深圳列入eVTOL试点
没有遗嘱遗产怎么申领?一文详解遗产继承流程
香港公司境内管理机构全解析:让你的企业合法合规
广场舞是具有中国特色的健身文化符号