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

相关推荐
果粒蹬i1 分钟前
Python + AI:打造你的智能害虫识别助手
开发语言·人工智能·python
蒸蒸yyyyzwd1 分钟前
stl源码剖析迭代器学习笔记
c语言·c++
Big Cole1 分钟前
PHP面试题(Redis核心知识篇)
开发语言·redis·php
红色的小鳄鱼2 分钟前
Vue 教程 自定义指令 + 生命周期全解析
开发语言·前端·javascript·vue.js·前端框架·html
阿钱真强道2 分钟前
09 jetlinks-mqtt-属性主动上报-windows-python-实现
开发语言·windows·python·网络协议
小二·2 分钟前
Go 语言系统编程与云原生开发实战(第7篇)分布式系统核心能力:配置中心 × 链路追踪 × 熔断降级(生产级落地)
开发语言·云原生·golang
lead520lyq4 分钟前
Golang Grpc接口调用实现账号密码认证
开发语言·后端·golang
EQ-雪梨蛋花汤5 分钟前
【问题反馈】JNI 开发:为什么 C++ 在 Debug 正常,Release 却返回 NaN?
开发语言·c++
naruto_lnq5 分钟前
高性能消息队列实现
开发语言·c++·算法
charlie1145141916 分钟前
malloc 在多线程下为什么慢?——从原理到实测
开发语言·c++·笔记·学习·工程实践