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

news2024/11/25 9:44:46
说明:

均由 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. 需要在运行时动态切换不同的产品系列。

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

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

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

相关文章

最新世界银行WDI面板数据(1960-2022年)

The World Development Indicators 是由世界银行编制和发布的全面数据集&#xff0c;旨在提供全球发展的详尽统计信息。这份数据集收录了1960-2022年间&#xff0c;世界266个国家共计1477个指标&#xff0c;涵盖经济、社会、环境、教育、公共卫生等20个领域 一、数据介绍 数据…

什么样的人不适合当老师

虽然教师职业具有诸多优点&#xff0c;如较高的社会地位、稳定的收入和良好的职业前景等&#xff0c;但是并不是所有人都适合成为一名教师。 缺乏耐心和细心的人&#xff1a;作为一名教师&#xff0c;需要具备足够的耐心和细心&#xff0c;能够应对各种学生问题。如果你很容易失…

Slf4j使用Logback时,Logback如何初始化

前言 Slf4j SLF4J&#xff0c;全称 Simple Logging Facade for Java&#xff0c;是一个用于Java编程语言的日志系统抽象层。它为多种现有日志框架&#xff08;例如Log4j、java.util.logging等&#xff09;提供了统一的接口, 但自身并不实现日志功能。 SLF4J 允许用户在部署时…

6.2 Windows驱动开发:内核枚举SSSDT表基址

在Windows内核中&#xff0c;SSSDT&#xff08;System Service Shadow Descriptor Table&#xff09;是SSDT&#xff08;System Service Descriptor Table&#xff09;的一种变种&#xff0c;其主要用途是提供Windows系统对系统服务调用的阴影拷贝。SSSDT表存储了系统调用的函数…

Namecheap怎么样,Namecheap优惠码以及注册手把手教程

Namecheap 是一家成熟的服务器域名托管公司&#xff0c;可以为合适的客户提供良好的解决方案。这些优点和缺点应该让您清楚地了解您的期望&#xff0c;以便您知道这是否是您网站的正确选择。 Namecheap怎么样&#xff1f; 已成立的公司&#xff1a; Namecheap 已经营 20 多年…

HDFS JAVA API的应用

首先把hadoop服务起来 1. (简答题) 使用HDFS 的JAVA API 进行编程&#xff1a; &#xff08;1&#xff09;获取自己HDFS集群下的所有文件和目录&#xff1b; //获取自己HDFS集群下的所有文件和目录&#xff1b;import org.apache.hadoop.conf.Configuration; import org.apa…

LeetCode Hot100 437.路径总和III

题目&#xff1a; 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从…

pandas 如何获取dataframe的行的数量

pandas的dataframe提供了多种方法获取其中数据的行的数量&#xff0c;本偏文章就是介绍几种获取dataframe行和列出量的方法。 为了能够详细说明如何通过代码获取dataframe的行数和列数&#xff0c;需要先创建一个dataframe如下&#xff1a; import pandas as pdtechnologies …

微机11111

一、填空题&#xff08;共15分&#xff0c;每空1分&#xff09; 1、十六进制数30A.5转换为二进制是__________&#xff0c;转换为十进制是_________ 001100001010.0101B 778.3125 十六进制转换二进制 将一位十六进制分解成四位二进制 十六进制转换十进制 3X1620X16110X1605X1…

重生之我是一名程序员 42——字符分类函数

哈喽啊大家晚上好&#xff01;今天呢给大家带来一些超简单的知识&#xff0c;大家是需要浅浅理解就行了。所以今天给大家带来的知识是——字符分类函数。 首先呢还是给大家介绍一下它们&#xff0c;字符分类函数是一种函数&#xff0c;它根据一定的规则将字符分组或分类。在编…

大模型三阶段训练

为了训练专有领域模型&#xff0c;选择LLaMA2-7B作为基座模型&#xff0c;由于LLaMA模型中文词表有限&#xff0c;因此首先进行中文词表的扩展&#xff0c;然后进行三阶段训练&#xff08;增量预训练&#xff0c;有监督微调&#xff0c;强化学习&#xff09;。 代码将全部上传…

IDEA2023版本创建Sping项目只能勾选17和21,却无法使用Java8?(已解决)

文章目录 前言分析解决方案一&#xff1a;替换创建项目的源方案二&#xff1a;升级JDK版本 参考文献 前言 起因 想创建一个springboot的项目&#xff0c;本地安装的是1.8&#xff0c;但是在使用Spring Initializr创建项目时&#xff0c;发现版本只有17和21。 在JDK为1.8的情况下…

LeetCode Hot100 236.二叉树的最近公共祖先

题目&#xff1a; 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节…

从微软Cosmos DB浅谈一致性模型

最近回顾了微软的Cosmos DB的提供一致性级别&#xff0c;重新整理下一致性模型的相关内容。 0. Cosmos DB Cosmos DB&#xff08;Azure Cosmos DB&#xff09;是由微软推出的一个支持多模型、多 API 的全球分布式数据库服务。它旨在提供高度可扩展性、低延迟、强一致性和全球…

大数据平台/大数据技术与原理-实验报告--部署全分布模式Hadoop集群

实验名称 部署全分布模式Hadoop集群 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.10.16-2023.10.20 实验仪器设备以及实验软硬件要求 专业实验室&#xff08;配有cen…

Prove that exponential function f(x)=e^x is not Lipschitz on R

https://math.stackexchange.com/questions/3980014/prove-that-ex-is-not-lipschitz-on-r https://math.ucr.edu/~res/math205A-2014/lipschitz2.pdf

AI算法中的模型量化岗是做什么的

今天介绍一个在 AI 算法领域比较常见而且很重要的岗位——模型量化岗。 按惯例&#xff0c;先从某聘上截图一个量化工程师的招聘信息。 只看与量化相关的词&#xff0c;基本涉及到了量化精度、模型结构、算法这些关键词&#xff0c;下面来介绍一下这个岗位。 1、先看下什么是模…

LeetCode:1457. 二叉树中的伪回文路径(DFS C++ Java)

目录 1457. 二叉树中的伪回文路径 题目描述&#xff1a; 原理思路&#xff1a; 1457. 二叉树中的伪回文路径 题目描述&#xff1a; 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的…

职场快速赢得信任

俗话说的好&#xff0c;有人的地方就有江湖。 国内不管是外企、私企、国企&#xff0c;职场环境都是变换莫测。 这里主要分享下怎么在职场中快速赢取信任。 1、找到让自己全面发展的方法 要知道&#xff0c;职场中话题是与他人交流的纽带&#xff0c;为了找到共同的话题&am…