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

07-原型模式-C语言实现

原型模式: Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象。 )

UML图:

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 原型接口
typedef struct {void* (*clone)(void*);
} Prototype;// 具体原型类
typedef struct {Prototype prototype;char* name;int age;
} ConcretePrototype;void* ConcretePrototype_clone(void* obj) {ConcretePrototype* self = (ConcretePrototype*)obj;ConcretePrototype* clone = malloc(sizeof(ConcretePrototype));memcpy(clone, self, sizeof(ConcretePrototype));clone->name = malloc(strlen(self->name) + 1);strcpy(clone->name, self->name);return clone;
}ConcretePrototype createConcretePrototype(char* name, int age) {ConcretePrototype prototype;prototype.prototype.clone = ConcretePrototype_clone;prototype.name = malloc(strlen(name) + 1);strcpy(prototype.name, name);prototype.age = age;return prototype;
}int main() {ConcretePrototype prototype = createConcretePrototype("Alice", 25);ConcretePrototype* clone = prototype.prototype.clone(&prototype);printf("Name: %s, Age: %d\n", clone->name, clone->age);free(clone->name);free(clone);return 0;
}

在上面的示例代码中,首先定义了原型接口Prototype,其中包含了一个克隆函数指针。然后定义了具体原型类ConcretePrototype,它实现了原型接口中的克隆函数。

接着在main函数中,创建了一个具体原型对象prototype,然后通过克隆函数创建了一个新的对象clone,最后输出了新对象的属性。

原型模式的优点:

  1. 可以动态克隆对象,减少了对象创建过程中的时间和资源消耗。

  2. 可以隐藏对象创建细节,使用户无需关心对象的创建方式。

  3. 可以为使用者提供更加灵活的对象创建方式。

原型模式的缺点:

  1. 需要深度复制对象的所有属性,包括引用类型的属性,否则会出现浅拷贝导致的问题。

  2. 如果对象有循环引用,则需要特殊处理。

适用场景:

  1. 对象的创建过程比较复杂或耗时,需要缩短对象创建时间。

  2. 对象的创建方式比较固定,但是需要某些属性进行个性化设置。

  3. 对象的构造函数是私有的,不能直接调用,但又需要复制该对象。

http://www.lryc.cn/news/251199.html

相关文章:

  • 深度学习与深度迁移学习有什么区别?
  • 创建Asp.net MVC项目Ajax实现视图页面数据与后端Json传值显示
  • 1089 Insert or Merge (插入排序,相邻归并排序,附模拟实现)
  • 基于算能的国产AI边缘计算盒子8核心A53丨17.6Tops算力
  • Eaxyx 让圆球跟随鼠标移动
  • Node.js 事件循环:定时任务、延迟任务和 I/O 事件的艺术
  • 陪诊系统:基于自然语言处理的患者沟通创新
  • 实用攻略——SD-WAN网络配置步骤详解
  • ​无人机摄影测量
  • 对el-select封装成组件使用
  • pytorch 多卡并行训练
  • C# Bin、XML、Json的序列化和反序列化
  • mediapipe+opencv实现保存图像中的人脸,抹去其他信息
  • clickhouse的向量化执行
  • R语言实验三
  • springboot-mongodb-连接配置
  • 基于单片机的多功能视力保护器(论文+源码)
  • 如何保护 API 安全
  • 工业机器视觉megauging(向光有光)使用说明书(十五,轻量级的visionpro)
  • Linux e2fsck命令教程:如何检查和修复文件系统(附案例详解和注意事项)
  • TypeScript 的安装与使用
  • Git版本管理配置说明 - Visual Studio
  • Rust语言项目实战(四) - 界面绘制与渲染
  • 动态规划学习——回文串
  • 优化你的计算机性能:如何根据 CPU 占用率决定硬件升级
  • 探索低代码之路——JNPF
  • Day01 嵌入式 -----流水灯
  • Redis集群详解
  • 【随笔】个人面试纪录
  • Vue3的reactive、ref、toRef、toRefs用法以及区别