QT设计模式:抽象工厂模式

基本概念:

抽象工厂模式是一种创建型设计模式,封装了一组相关或依赖的对象的创建逻辑,而不需要指定具体的类。

使用抽象工厂模式,客户端可以创建一系列相关的对象,而无需关心这些对象的具体实现细节,从而实现了对象的创建和使用的解耦。

抽象工厂模式需要实现以下类:

  • 抽象工厂(Abstract Factory):定义了创建一系列相关对象的接口。
  • 具体工厂(Concrete Factory):实现了抽象工厂定义的接口,负责创建一系列相关的具体对象。
  • 抽象产品(Abstract Product):定义了一系列相关对象的接口。
  • 具体产品(Concrete Product):实现了抽象产品定义的接口,是一系列相关对象的具体实现。

使用场景:

  • 当需要一次性创建一组相关的对象,而这些对象之间存在着某种关联或依赖关系时。

  • 当系统需要支持多个产品族,并且希望客户端能够灵活地选择和切换不同的产品族时。

  • 对象的创建和使用需要解耦时。

实现:

// 抽象产品A
class AbstractProductA {
public:virtual void operationA() const = 0;
};// 具体产品A 1
class ConcreteProductA1 : public AbstractProductA {
public:void operationA() const override {// 具体产品 A1 的操作}
};// 具体产品A 2
class ConcreteProductA2 : public AbstractProductA {
public:void operationA() const override {// 具体产品 A2 的操作}
};// 抽象产品B
class AbstractProductB {
public:virtual void operationB() const = 0;
};// 具体产品B 1
class ConcreteProductB1 : public AbstractProductB {
public:void operationB() const override {// 具体产品 B1 的操作}
};// 具体产品B 2
class ConcreteProductB2 : public AbstractProductB {
public:void operationB() const override {// 具体产品 B2 的操作}
};
// 抽象工厂
class AbstractFactory {
public:virtual AbstractProductA* createProductA() = 0;virtual AbstractProductB* createProductB() = 0;
};// 具体工厂 1
class ConcreteFactory1 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA1();}AbstractProductB* createProductB() override {return new ConcreteProductB1();}
};// 具体工厂 2
class ConcreteFactory2 : public AbstractFactory {
public:AbstractProductA* createProductA() override {return new ConcreteProductA2();}AbstractProductB* createProductB() override {return new ConcreteProductB2();}
};

QT的模型类

QT的模型类的实现也体现了抽象工厂模式。

  • 抽象工厂(Abstract Factory):例如 QAbstractItemModelQAbstractListModelQAbstractTableModel 等。这些抽象类定义了一组接口,用于创建模型类的实例。

  • 具体工厂(Concrete Factory):例如 QStandardItemModelQSqlQueryModelQFileSystemModel 等,它们实现了 QAbstractItemModel 接口,并负责创建具体的模型对象。

  • 抽象产品(Abstract Product):抽象产品可以是模型类中定义的接口和纯虚函数,例如 data()setData()rowCount()columnCount() 等。

  • 具体产品(Concrete Product):。在 Qt 中,具体产品可以是继承自抽象模型类的具体模型类,例如 QStandardItemModelQSqlQueryModelQFileSystemModel 等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp video 层级覆盖

层级覆盖 cover-view组件 我这里做了个判断 监听全屏时隐藏按钮 根据项目需求自行更改

c++ 判断点和折线 距离

目录 点在折线y方向的投影的距离 判断点是否在折线下方&#xff0c;不求距离 点在折线y方向的投影的距离 x相同时&#xff0c;y的差异。 #include <iostream> #include <vector> #include <cmath> #include <limits>struct Point {double x, y; };…

鸿蒙编译子系统详解(八)hb env、clean、tool、help

1.5.5 hb其他 除了编译相关的hb set和hb build&#xff0c;hb还有其他模块。 1.5.5.1 hb env env主要是打印编译环境信息。 env的相关源码与set、build类似&#xff1a; build/hb/modules/interface/env_module_interface.pybuild/hb/modules/ohos_env_module.pybuild/hb/resol…

2024.5.6 关于 SpringCloud 的基本认知

目录 引言 微服务框架所包含的技术栈 微服务架构演变 单体架构 分布式架构 微服务架构 微服务技术对比 认识 SpringCloud SpringBoot 版本兼容关系 服务拆分和远程调用 服务拆分注意事项 远程调用 引言 微服务是一种框架风格&#xff0c;按照业务板块来划分应用代码…

微信小程序(Taro)获取经纬度并转化为具体城市

1、获取经纬度 申请权限&#xff0c;想要使用微信小程序获取经纬度的方法是要申请该方面的权限。 获取经纬度的方法有很多选择其中一个使用就好。 我使用的是Taro.getFuzzyLocation(&#xff09; 在app.config.js中需要添加设置 requiredPrivateInfos: ["getFuzzyLocat…

群晖上部署农场管理系统farmOS

什么是 farmOS &#xff1f; farmOS 是一个基于 Web 的应用程序&#xff0c;用于农场管理、规划和记录保存。它由志愿者社区开发&#xff0c;旨在为农民、开发人员和研究人员提供一个标准平台。 需要注意的是&#xff0c;群晖内核版本太低会遇到下面的错误&#xff0c;这个 AH0…

高实时、高可靠的微内核操作系统——鸿道Intewell

近年来&#xff0c;我国不断推进工业转型升级&#xff0c;力求实现从传统工业大国向现代工业强国的跨越。想要在新一轮科技革命中“超车”&#xff0c;需要从多个维度进行深度布局和全面发力。 ——科技创新是核心驱动力 积极推动工业结构的优化和升级&#xff0c;通过发展新…

vue脚手架和vite创建的项目的环境配置

开发环境文件 .env.development NODE_ENV"development" # // 开发接口域名 本地测试就用这个 # vue脚手架创建的 VUE_APP_MODE"开发环境" VUE_APP_API_URL http://19527 # vite创建的 # VITE_MODE"开发环境" # VITE_BASE_URL http://1920:9527…

python环比分析日常消费数据掌握月支出增减情况

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.分析 一.前言 月支出是指个人或家庭在一个月内用于消费、投资、储蓄等方面的资金流出总额。它是反映个人或家庭经济状况的重要指标之一,可以帮助人们更好地规划和管理自己的财务。 月支出的构成…

Linux系统(项目管理和LINUX)

目录 一、VMWare安装和使用 1.安装VMware 2.使用VMware 二、常用命令 三、常用配置 环境变量配置&#xff1a; 系统文件配置&#xff1a; 软件包配置&#xff1a; 安全配置&#xff1a; 其他配置&#xff1a; 四、Xshell的使用 安装 Xshell&#xff1a; 启动 Xshe…

《论文阅读》MISC:一个融合COMET的情感支持会话混合策略感知模型 ACL 2022

《论文阅读》MISC:一个融合COMET的情感支持会话混合策略感知模型 ACL 2022 前言简介模型架构Mental State-Enhanced EncoderMixed Strategy Learning ModuleMulti-Factor-Aware Decoder损失函数实验评估问题前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ …

linux设置挂载指定的usb,自动挂载

一、设置指定的USB 在Linux系统中&#xff0c;如果您只想让系统挂载特定的USB设备&#xff0c;而忽略其他的USB设备&#xff0c;可以通过创建自定义的udev规则来实现。以下是设置系统只能挂载指定USB设备的基本步骤&#xff1a; 确定USB设备的属性&#xff1a; 首先&#xff0…

力扣热题100刷题笔记[python]

letcode100 题录地址: https://leetcode.cn/studyplan/top-100-liked/ 注:另外有记忆精简版 [LeetCode热题100_记忆版.md](file:///D:/yingl/文件/notes_-yl/技术精品文章/编程基本功/算法资料汇总/LeetCode热题100_记忆版.md) 哈希 两数之和 思路: 0、用 hash_table =…

LLMs之GPT4ALL:GPT4ALL的简介、安装和使用方法、案例应用之详细攻略

LLMs之GPT4ALL&#xff1a;GPT4ALL的简介、安装和使用方法、案例应用之详细攻略 目录 GPT4ALL的简介 0、新功能 1、特点 2、功能 3、技术报告 GPT4ALL的安装和使用方法 1、安装 2、使用方法 GPT4ALL的案例应用 LLMs之LLaMA3&#xff1a;基于GPT4ALL框架对LLaMA-3实现…

【DeepLearning.AI】吴恩达系列课程——使用ChatGPT API构建系统(持续更新中——)

目录 前言一、Language Models, the Chat Format and Tokens&#xff08;LLM&#xff0c;交互形式&#xff09;1-1、加载api-key1-2、使用辅助函数&#xff08;即指令调整LLM&#xff09;1-2、使用辅助函数&#xff08;聊天格式&#xff09;1-3、辅助函数修改&#xff08;输出字…

Python中的多线程与多进程编程:深入解析与应用

Python中的多线程与多进程编程&#xff1a;深入解析与应用 一、引言 在Python编程中&#xff0c;多线程和多进程是实现并发执行的重要手段。随着计算需求的日益增长&#xff0c;单线程或单进程模型往往难以满足实时响应、高效利用多核CPU等要求。因此&#xff0c;了解并掌握P…

安卓SELinux策略

SELinux策略语言–类型强制(编写TE规则) selinux权限说明及问题解决 Selinux篇3 -TE规则 Android中SeLinux权限 .te文件编写 Android 系统添加SELinux权限 [SeLinux]audit2allow安装与使用 SELinux规则添加进阶

文件各种上传,离不开的表单 [html5]

作为程序员的我们&#xff0c;经常会要用到文件的上传和下载功能。到了需要用的时候&#xff0c;各种查资料。有木有..有木有...。为了方便下次使用&#xff0c;这里来做个总结和备忘。 利用表单实现文件上传 最原始、最简单、最粗暴的文件上传。 前端代码&#xff1a; //方…

LeetCode力扣题目111:多种算法对比实现二叉树的最小深度

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

WPF 图片显示某一部分区域

效果图&#xff1a; 代码&#xff1a; <Image Width"32"HorizontalAlignment"Right"Height"32"Source"../../Resources/Images/BLUEWOLF.jpg"><Image.Clip><PathGeometry><PathFigure StartPoint"32,32&quo…