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

相关推荐
wuminyu19 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
小徐不徐说19 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang20 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog20 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象32720 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy123931021621 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷21 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang21 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj5201 天前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵1 天前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++