当前位置: 首页 > news >正文

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式

什么是抽象工厂?

抽象工厂模式是一种创建型设计模式,让你能够保证在客户端程序中创建一系列有依赖的对象组时,无需关心这些对象的类型。

具体来说:

  • 对象的创建与使用分离: 抽象工厂模式通过引入抽象工厂接口以及具体工厂类,将对象的创建与使用分离开来。这使得客户端代码与具体的产品类解耦,提高了系统的灵活性和可维护性。
  • 产品族的创建: 在某些情况下,一个系统需要一组相关或相互依赖的对象,而不是单个对象。抽象工厂模式可以方便地创建整个产品族,确保这些对象之间的兼容性和一致性。
  • 更易于替换产品系列: 通过使用抽象工厂模式,可以轻松地替换整个产品系列,而无需修改客户端代码。只需要更改具体工厂的实现即可实现产品族的变更,这种灵活性对于系统的扩展和维护非常有用。
  • 隐藏实现细节: 抽象工厂模式隐藏了实际产品的创建细节,客户端只需与抽象工厂接口进行交互,而不必关心具体产品是如何创建的。这有助于保持代码的简洁性和可读性。

什么是工厂模式?

对于工厂模式和抽象工厂模式的区别,个人认为:
工厂模式——工厂和产品是一对一的关系,即每个工厂只负责一个产品。
抽象工厂模式——工厂和产品是一对多的关系,即每个工厂负责一个产品族。

C++实现一版抽象工厂的例子:

在这里插入图片描述

说明:(个人理解总结)

  • 将工厂抽象的意义:产品系列的划分由后端写入到实体工厂中,客户端只需感知一个抽象工厂接口(传给客户端什么实体工厂,客户端就用什么),需要产品时由工厂代为构建,客户端只管使用产品所提供的方法即可,无需关注产品属于哪个系列。实现客户端与具体产品的解耦。
  • 将产品抽象的意义:在客户端通过工厂创建出产品后,此时这个产品的系列是不确定的(系列取决于实体工厂中的指定),此时为了实现客户端与产品的解耦,需要用抽象产品引用或指针进行接收。
/*************************************************************************> File Name: AbstractFactory.cpp> Author:> Mail:> Created Time: Fri Mar  8 14:51:39 2024************************************************************************/#include <iostream>using namespace std;// Abstarct product(File)
class AbstractFile {
public:virtual ~AbstractFile() = default;virtual void f_open() = 0;
};class File_Linux : public AbstractFile {
public:void f_open() override {// The logic of opening files in Linux.cout << "Opening files successful in Linux !!!" << endl;return ;}
};class File_Windows : public AbstractFile {
public:void f_open() override {// The logic of opening files in Windows.cout << "Opening files successful in Windows !!!" << endl;return ;}
};// Abstract product(Process)
class AbstractProcess {
public:virtual ~AbstractProcess() = default;virtual void create() = 0;
};class Process_Linux : public AbstractProcess {
public:void create() override {// The logic of create process in Linux.cout << "Create process successful in Linux !!!" << endl;return ;}
};class Process_Windows : public AbstractProcess {
public:void create() override {// The logic of create process in Windows.cout << "Create process successful in Windows !!!" << endl;return ;}
};// Abstarct Factory(Creating Product)
class AbstractFactory {
public:virtual AbstractFile* CreateFile() = 0;virtual AbstractProcess* CreateProcess() = 0;
};class LinuxFactory : public AbstractFactory {
public:AbstractFile* CreateFile() override {return new File_Linux();}AbstractProcess* CreateProcess() override {return new Process_Linux();}
};class WindowsFactory : public AbstractFactory {
public:AbstractFile* CreateFile() override {return new File_Windows();}AbstractProcess* CreateProcess() override {return new Process_Windows();}
};void ClientCode(AbstractFactory *factoy_obj) {AbstractFile *file = factoy_obj->CreateFile();file->f_open();AbstractProcess *process = factoy_obj->CreateProcess();process->create();delete file;delete process;
};int main() {LinuxFactory ins_linux;ClientCode(&ins_linux);WindowsFactory ins_windows;ClientCode(&ins_windows);return 0;
}

相关文章:

  • YOLOv9改进策略:注意力机制 |通道注意力和空间注意力CBAM | GAM超越CBAM,不计成本提高精度
  • C# ListView 控件使用
  • Java初阶数据结构队列的实现
  • 在分布式环境中使用状态机支持数据的一致性
  • 安卓通过termux部署ChatGLM
  • 【自然语言处理】NLP入门(五):1、正则表达式与Python中的实现(5):字符串常用方法:对齐方式、大小写转换详解
  • 12-数据权限
  • 配置管理可能存在的问题
  • 幻兽帕鲁服务器搭建运行遇到的问题详解
  • 图片编辑器tui-image-editor
  • IDEA自定义Maven仓库
  • LinuxC++操作mysql数据库(#include <mysql/mysql.h>的使用)
  • 新 树莓派4B 温湿度监测 基于debian12的树莓派OS
  • Python之函数进阶-柯里化
  • 【数据结构】树与堆 (向上/下调整算法和复杂度的分析、堆排序以及topk问题)
  • .pyc 想到的一些问题
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • C++11: atomic 头文件
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CAP理论的例子讲解
  • es6(二):字符串的扩展
  • Github访问慢解决办法
  • Js基础知识(四) - js运行原理与机制
  • oldjun 检测网站的经验
  • Python中eval与exec的使用及区别
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • spring boot下thymeleaf全局静态变量配置
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 分布式熔断降级平台aegis
  • 工程优化暨babel升级小记
  • 基于组件的设计工作流与界面抽象
  • 盘点那些不知名却常用的 Git 操作
  • 试着探索高并发下的系统架构面貌
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用简单代码看卷积组块发展
  • 由插件封装引出的一丢丢思考
  • Android开发者必备:推荐一款助力开发的开源APP
  • ​【已解决】npm install​卡主不动的情况
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (poj1.2.1)1970(筛选法模拟)
  • (超详细)语音信号处理之特征提取
  • (分享)自己整理的一些简单awk实用语句
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Linq学习笔记
  • (转)ObjectiveC 深浅拷贝学习
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .NET 中 GetProcess 相关方法的性能
  • .net连接oracle数据库
  • .NET企业级应用架构设计系列之应用服务器