抽象工厂模式-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. 需要在运行时动态切换不同的产品系列。

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

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

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

相关文章

淼一科技为互联网企业销毁硬盘数据 拆除机房设备

在上海这座繁华的大都市&#xff0c;淼一科技以其专业的服务和卓越的技术&#xff0c;为众多互联网企业提供硬盘数据销毁和机房设备拆除服务。作为业界领先的数据安全解决方案提供商&#xff0c;淼一科技致力于保障客户数据的安全与隐私&#xff0c;为客户创造更高的商业价值。…

Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)

目录 Node.js Stream(流)&#xff08;三&#xff09; Node.js http模块 Node.js GET/POST请求&#xff08;一&#xff09; Node.js GET/POST请求&#xff08;二&#xff09; Node.js 路由 Node.js 创建客户端 Node.js 作为中间层 Node.js 文件系统模块&#xff08;一&am…

解释LED显示屏的裸眼3D特效原理

LED电子大屏幕的3D特效技术正在不断发展&#xff0c;而实现这一技术的原理主要包括分光、分色、分时和光栅等四种方法。这些原理都有各自的特点和应用场景&#xff0c;下面将对它们进行详细介绍。 1. 分光方法 分光方法是一种基于偏振光的3D显示技术。通过使用偏振滤镜或偏振片…

曝光!WPS用户信息或被盗用,紧急行动,迅软DSE数据加密应时而动!

WPS摊上大事了&#xff01;有用户发现&#xff0c;在WPS更新的一版用户隐私政策中&#xff0c;明确提到&#xff1a;“我们将对您主动上传的文档材料&#xff0c;在处理后作为AI训练的基础材料使用。”换句话说&#xff0c;WPS有可能“白嫖”用户的文档信息&#xff0c;用于投喂…

A preview error may have occurred. Switch to the Log tab to view details.

我们在学习鸿蒙应用开发的UIAbility内页面间的跳转内容的时候会遇到页面无法跳转的问题。并伴随标题的error报错 Entry Component struct Index {build() {Column({ space: CommonConstants.COLUMN_SPACE }) {//UIAbility内页面间的跳转Button(Next).onClick(() > {router.…

好用的基于layui的免费开源后台模版layuimini

发现一个好用的后台模版 基于layui的免费开源后台模版layuimini layuimini - 基于Layui的后台管理系统前端模板 easyadmin开源项目 EasyAdmin是基于ThinkPHP6.0Layui的快速开发的后台管理系统。 演示站点 演示地址&#xff1a;跳转提示&#xff08;账号&#xff1a;admin&a…

【mmseg】ValueError: Only one of `max_epochs` or `max_iters` can be set.报错解决

目录 &#x1f49c;&#x1f49c;1背景 ❤️ ❤️2分析 &#x1f525;2.1config查看 &#x1f525;2.2BaseRunner基类 &#x1f49a;&#x1f49a;3解决 &#x1f525;3.1按照epoch &#x1f525;3.2按照iters 整理不易&#xff0c;欢迎一键三连&#xff01;&#xff01…

PTA NeuDS-数据库题目集

一.判断题 1.在数据库中产生数据不一致的根本原因是冗余。T 解析&#xff1a;数据冗余是数据库中产生数据不一致的根本原因&#xff0c;因为当同一数据存储在多个位置时&#xff0c;如果其中一个位置的数据被修改&#xff0c;其他位置的数据就不一致了。因此&#xff0c;在数据…

在Linux中对Docker中的服务设置自启动

先在Linux中安装docker&#xff0c;然后对docker中的服务设置自启动。 安装docker 第一步&#xff0c;卸载旧版本docker。 若系统中已安装旧版本docker&#xff0c;则需要卸载旧版本docker以及与旧版本docker相关的依赖项。 命令&#xff1a;yum -y remove docker docker-c…

编程学习及常见的技术难题

文章目录 编程学习及常见的技术难题引言如何学习编程学习参考开发工具推荐编程中常见的技术难题 编程学习及常见的技术难题 引言 学习编程是一件有趣也有挑战的事情&#xff0c;它可以让你创造出各种有用的软件&#xff0c;解决各种复杂的问题&#xff0c;甚至改变世界。 编程中…

萤石云接口调用

获取appKey和secret 登录后在开发者服务-我的应用中获取 根据appKey和secret获取accessToken 参考官方文档&#xff1a;文档概述 萤石开放平台API文档 # 获取accessToken url_accessToken"https://open.ys7.com/api/lapp/token/get" data {"appKey": &…

大模型的开源闭源

文章目录 开源&闭源开源和闭源的优劣势比较开源和闭源对大模型技术发展的影响开源与闭源的商业模式比较国内的大模型开源和闭源的现状和趋势 开源和闭源&#xff0c;两种截然不同的开发模式&#xff0c;对于大模型的发展有着重要影响。 开源让技术共享&#xff0c;吸引了众…