03-抽象工厂模式-C语言实现

说明:

均由 chatgpt生成,实例可以看出无法运行,仅供参考~ 

抽象工厂模式:

代码实现:
#include <stdio.h>

// 定义抽象产品接口
typedef struct {
    void (*operation)();
} AbstractProductA;

typedef struct {
    void (*operation)();
} AbstractProductB;

// 具体产品A1
typedef struct {
    AbstractProductA abstractProductA;
} ConcreteProductA1;

void ConcreteProductA1_operation() {
    printf("具体产品 A1 的操作\n");
}

// 具体产品A2
typedef struct {
    AbstractProductA abstractProductA;
} ConcreteProductA2;

void ConcreteProductA2_operation() {
    printf("具体产品 A2 的操作\n");
}

// 具体产品B1
typedef struct {
    AbstractProductB abstractProductB;
} ConcreteProductB1;

void ConcreteProductB1_operation() {
    printf("具体产品 B1 的操作\n");
}

// 具体产品B2
typedef struct {
    AbstractProductB abstractProductB;
} ConcreteProductB2;

void ConcreteProductB2_operation() {
    printf("具体产品 B2 的操作\n");
}

// 定义抽象工厂接口
typedef struct {
    AbstractProductA* (*createProductA)();
    AbstractProductB* (*createProductB)();
} AbstractFactory;

// 具体工厂1
typedef struct {
    AbstractFactory abstractFactory;
} ConcreteFactory1;

AbstractProductA* ConcreteFactory1_createProductA() {
    return (AbstractProductA*)malloc(sizeof(ConcreteProductA1));
}

AbstractProductB* ConcreteFactory1_createProductB() {
    return (AbstractProductB*)malloc(sizeof(ConcreteProductB1));
}

// 具体工厂2
typedef struct {
    AbstractFactory abstractFactory;
} ConcreteFactory2;

AbstractProductA* ConcreteFactory2_createProductA() {
    return (AbstractProductA*)malloc(sizeof(ConcreteProductA2));
}

AbstractProductB* ConcreteFactory2_createProductB() {
    return (AbstractProductB*)malloc(sizeof(ConcreteProductB2));
}

int main() {
    AbstractFactory* factory1 = (AbstractFactory*)malloc(sizeof(ConcreteFactory1));
    factory1->createProductA = ConcreteFactory1_createProductA;
    factory1->createProductB = ConcreteFactory1_createProductB;

    AbstractProductA* productA1 = factory1->createProductA();
    AbstractProductB* productB1 = factory1->createProductB();

    productA1->operation();
    productB1->operation();

    free(productA1);
    free(productB1);

    AbstractFactory* factory2 = (AbstractFactory*)malloc(sizeof(ConcreteFactory2));
    factory2->createProductA = ConcreteFactory2_createProductA;
    factory2->createProductB = ConcreteFactory2_createProductB;

    AbstractProductA* productA2 = factory2->createProductA();
    AbstractProductB* productB2 = factory2->createProductB();

    productA2->operation();
    productB2->operation();

    free(productA2);
    free(productB2);

    free(factory1);
    free(factory2);

    return 0;
}

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口或抽象类,用于创建相关或依赖对象的家族,而不需要指定具体的类。抽象工厂模式通过封装一组相关的产品对象的创建逻辑,使得客户端可以通过统一的接口来创建这些产品对象。

优点:

  1. 将产品家族的创建和使用分离:抽象工厂模式将产品家族的创建逻辑集中在一个工厂类中,使得客户端无需关心具体的产品创建细节。客户端只需要通过抽象工厂接口来创建产品对象,从而将产品的使用与产品的创建解耦。
  2. 提供一致性的产品族:抽象工厂模式确保了一组相关的产品对象能够一起使用,保证了产品之间的兼容性和一致性。
  3. 便于交换产品系列:由于抽象工厂模式将产品的创建逻辑封装在具体的工厂类中,当需要更换产品系列时,只需切换具体的工厂类即可。

缺点:

  1. 不易扩展新的产品:当需要新增产品时,需要修改所有的具体工厂类,违反了开闭原则。这意味着每次新增产品都需要修改抽象工厂和所有具体工厂的代码,可能导致代码变得庞大而复杂。
  2. 增加了系统的抽象性和复杂性:引入抽象工厂模式会增加额外的抽象层,使得系统更加复杂,对于简单的产品结构和需求较少的系统可能会显得过度设计。

适用场景:

抽象工厂模式适用于以下情况:

  1. 系统需要一组相关的产品对象,并且这些产品对象之间有一定的约束或依赖关系。
  2. 客户端希望只使用产品的抽象接口,而无需关心具体的产品实现细节。
  3. 需要在运行时动态切换不同的产品系列。

需要注意的是,抽象工厂模式适合处理产品族的创建,而不适合处理单个产品的创建。如果只涉及单个产品的创建,可以考虑使用工厂方法模式。另外,抽象工厂模式在系统中增加了抽象性,如果系统规模较小或者产品结构简单,可能会显得过度设计,此时可以考虑使用简单工厂模式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux设置权限_setfacl_getfacl

3.2 设置权限ACL&#xff08;access control list&#xff09; 假设&#xff1a;/data所有者与所属组均为root&#xff0c;在不改变所有者的前提下&#xff0c;要求用户tom对该目录有完全访问权限&#xff08;rwx&#xff09;。只能考虑&#xff1a; 方法一&#xff1a;给/dat…

Data Grip的安装和使用

安装&#xff1a; 1.1 双击 exe 文件安装 1.2选择安装目录&#xff0c;点击next 1.3选择安装目录&#xff0c;点击next 1.3 创建快捷方式&#xff0c;安装 1.4点击install 连接&#xff1a; 2.1 创建Project 2.2创建连接 下载驱动&#xff0c;可能时间会比较久一点&#xff0c…

保护您的数据库免受注入攻击:MSSQL注入入门指南

MSSQL注入的入门讲解 一、引言二、MSSQL注入的基础知识2.1、MSSQL数据库的基本原理和结构2.2、常见的SQL语句和操作2.3、MSSQL注入的原理和工作方式 三、MSSQL注入攻击技术3.1、基于错误的注入攻击&#xff1a;利用错误消息和异常信息3.2、基于时间的注入攻击&#xff1a;利用延…

ArkUI组件--image组件

Image&#xff1a;图片显示组件 1.声明Image组件并设置图片的源&#xff1a; Image(src:string|PixelMap|Resource) #src表示源&#xff0c;支持三种格式①string格式&#xff0c;常用来加载网络图片&#xff0c;填写网址。&#xff08;手机端需要申请网络访问权限&#xff1…

【JavaSE学习专栏】第03篇 数组

文章目录 1 数组的定义2 数组声明创建3 数组的初始化4 数组的四个基本特点5 数组边界6 数组的使用7 多维数组8 Arrays类9 冒泡排序9.1 原理9.2 代码实现 10 数组插入算法10.1 问题10.2 分析10.3 代码 11 稀疏矩阵11.1 稀疏数组介绍 1 数组的定义 数组是相同类型数据的有序集合。…

StarRC常见问题整理

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 使用starrc_cmd “错误代码”就能看对应Error或Warnning的解释。如: starrc_cmd SX-2505 1)nxtgrd版本问题 INFORMATION: TCAD_GRD_FILE (nxtgrd file) generate by > 4 years older version…

Flink入门(一)

整体框架 Flink概述Flink上手部署Flink架构DataStream API(算子)Flink中的时间和窗口&#xff1a;窗口就是范围处理函数&#xff1a;底层函数状态管理&#xff1a;容错机制&#xff1a;报错重启后能够从出错的位置继续执行FlinkSQL&#xff1a;功能逐步完善 基于数据流的有状…

【一周安全资讯1202】信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》;网络安全纳入注册会计师考试科目

要闻速览 1、信安标委发布《网络安全标准实践指南—网络安全产品互联互通 告警信息格式》 2、南昌某高校学生个人信息在境外公开出售&#xff0c;警方抓获学校"内鬼" 3、网络安全纳入注册会计师考试科目 4、乌克兰情报机构网攻俄罗斯民航局&#xff0c;称俄民航业正…

前端监控学习笔记

现成的SDK SentryFun Debug 需要监控什么&#xff1f; 错误统计 记录我们代码发布到线上各种奇奇怪怪的错误 行为日志埋点 记录用户行为&#xff0c;比如&#xff1a;分析用户浏览时间比较长的页面有哪些&#xff0c;常常点击的有哪些&#xff0c;可以做 相应的推荐 PV/UV统…

Python----字典练习

相关链接&#xff1a;Python---字典的增、删、改、查操作_python中字典的增删改查-CSDN博客 Python---字典---dict-CSDN博客 Python---引用变量与可变、非可变类型-CSDN博客 重点&#xff1a; 字典中的 key &#xff08;就是键&#xff09;可以是很多数据类型&#xff08;…

LLM:《第 1 部分》只是一个记忆技巧吗?

一、说明 批评者指责大型语言模型&#xff08;LLM&#xff09;仅仅是记忆工具已经变得很流行&#xff0c;他们认为他们对海量数据集的广泛训练几乎没有给真正的创造力留下什么空间。这种观点忽视了LLM背后的数学和经验科学&#xff0c;而正是这些数学和经验科学使KKM超越了基本…

科研者的福利!一个集论文、代码、数据集为一体的网站

Papers with Code 是一个总结了机器学习论文及其代码实现的网站。大多数论文都是有GitHub代码的。这个网站最好的地方就是对机器学习做了任务分类&#xff0c;检索对应的模型非常方便。早在18年Paper With Code创立时就轰动一时&#xff0c;仅创立一年就被Facebook收购。 Pape…

01.PostgresSQL进程与基础架构

PostgresSQL进程与基础架构 文中主要内容引用自PostgreSQL指南&#xff1a;内幕探索 本篇文章主要讲述PostgreSQL中进程与内存的架构 进程架构 PostgreSQL是一个客户端/服务器风格的关系型数据库管理系统&#xff0c;采用多进程架构&#xff0c;运行在单台主机上。 通常所谓…

孩子都能学会的FPGA:第十八课——用FPGA实现定点数的除法

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

Linux的基本指令(五)

目录 前言 tar指令(重要) 再次思考&#xff0c;为什么要打包和压缩呢&#xff1f; 实例&#xff1a;基于xshell进行压缩包在Windows与Linux之间的互传 实例&#xff1a;实现两个Linux系统之间的文件互传 bc指令 uname -r指令 重要的热键 关机与开机 扩展命令 shell及…

java实战(五):理解多线程与多线程实现冒泡排序及可视化

多线程 1.多线程理解1.1线程概念1.2线程的创建和启动1.3线程的同步与互斥1.4线程的状态和生命周期1.5线程间的通信1.6处理线程的异常和错误1.7实践 2.效果3.代码 1.多线程理解 1.1线程概念 线程&#xff1a;计算机中能够执行独立任务的最小单位。在操作系统中&#xff0c;每个…

【web安全】ssrf漏洞的原理与使用

前言 菜某对ssrf漏洞的总结。 ssrf的作用 主要作用&#xff1a;访问外界无法访问的内网进行信息收集。 1.进行端口扫描&#xff0c;资源访问 2.指纹信息识别&#xff0c;访问相应的默认文件 3.利用漏洞或者和payload进一步运行其他程序 4.get类型漏洞利用&#xff0c;传参数…

Dart编程基础 - 一种新的编程语言

Dart编程基础 – 一种新的编程语言 Dart Programming Essentials - A New Type of Programming Language By JacksonML Dart is a client-optimized language for fast apps on any platform From dart.dev 在1999年之前&#xff0c;和我一样对计算机技术感兴趣的伙伴们&…

Glide结合OkHttp保证短信验证接口携带图形验证码接口返回Cookie值去做网络请求

一、实现效果 二、步骤 注意&#xff1a;仅展示核心部分代码 1、导入依赖 api com.github.bumptech.glide:glide:4.10.0 kapt com.github.bumptech.glide:compiler:4.10.0 api com.squareup.okhttp3:okhttp:3.11.0 api com.squareup.okhttp3:logging-interceptor:3.11.02、自…

非应届生简历模板(13篇)

无论您是职场新人还是转行求职者&#xff0c;一份出色的简历都是获得心仪岗位的关键。本文为大家精选了13篇专业的非应届生简历模板&#xff0c;无论您的经验如何&#xff0c;都可以灵活参考借鉴&#xff0c;提升自己的简历质量。让简历脱颖而出&#xff0c;轻松斩获心仪职位&a…