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

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

UML图:

代码实现:

cpp 复制代码
#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. 对象的构造函数是私有的,不能直接调用,但又需要复制该对象。

相关推荐
yy我不解释9 分钟前
关于comfyui的mmaudio音频生成插件时时间不一致问题(四)(video upload)(解决方法)
开发语言·python·ai作画·音视频·comfyui
干啥啥不行,秃头第一名9 分钟前
C++与机器学习框架
开发语言·c++·算法
hongtianzai11 分钟前
Laravel7.x十大核心特性解析
java·c语言·开发语言·golang·php
永远睡不够的入14 分钟前
C++庖丁解牛:深入理解多态:从虚函数表到底层实现
开发语言·c++
姚青&15 分钟前
Pytest fixture 参数化(params 参数)
开发语言·python·pytest
qq_3349031518 分钟前
C++与人工智能框架
开发语言·c++·算法
weixin_6495556719 分钟前
C语言程序设计第四版(何钦铭、颜晖)第十章函数与程序结构之统计完全平方数
c语言·数据结构·算法
2401_8914821720 分钟前
C++中的状态模式
开发语言·c++·算法
9523623 分钟前
初识多线程
java·开发语言·jvm·后端·学习·多线程
m0_7369142225 分钟前
服务器上pip install spacy卡住解决方法
开发语言·python