本文介绍: 对象构造函数私有的,不能直接调用,但又需要复制对象可以动态克隆对象,减少了对象创建过程中的时间资源消耗。对象创建方式比较固定,但是需要某些属性进行个性化设置可以隐藏对象创建细节,使用户无需关心对象创建方式对象创建过程比较复杂或耗时,需要缩短对象创建时间。,包括引用类型属性,否则会出现浅拷贝导致的问题。在上面的示例代码中,首先定义原型接口。,然后通过克隆函数创建一个新的对象。,它实现原型接口中的克隆函数函数中,创建一个具体原型对象。,最后输出了新对象的属性。

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

UML图:

代码实现

#include <stdio.h&gt;
#include <stdlib.h&gt;
#include <string.h&gt;

// 原型接口
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(&amp;prototype);

    printf("Name: %s, Age: %dn", clone->name, clone->age);

    free(clone->name);
    free(clone);

    return 0;
}

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

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

原型模式的优点:

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

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

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

原型模式的缺点:

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

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

适用场景

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

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

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

原文地址:https://blog.csdn.net/qq_32059343/article/details/134751409

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_32272.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注