原型模式(大话设计模式)C/C++版本

news2025/4/21 19:59:42

原型模式

C++

参考:https://www.cnblogs.com/Galesaur-wcy/p/15924300.html

#include <iostream>
#include <string>
using namespace std;

class WorkExprerience
{
private:
    string workDate;
    string company;

public:
    WorkExprerience() {}
    ~WorkExprerience() {}

    WorkExprerience(WorkExprerience *work)
    {
        this->workDate = work->workDate;
        this->company = work->company;
    }

    string getWorkDate()
    {
        return workDate;
    }

    void setWorkDate(string workDate)
    {
        this->workDate = workDate;
    }

    string getCompany()
    {
        return company;
    }

    void setCompany(string company)
    {
        this->company = company;
    }

    WorkExprerience *Clone()
    {
        return new WorkExprerience(this);
    }
};

class Prototype
{
protected:
    string name;
    string sex;
    string age;
    string timeArea;
    string company;

public:
    virtual void SetPersonalInfo(string sex, string age) = 0;
    virtual void Display() = 0;
    virtual Prototype &Clone() = 0;
};

class Resume : public Prototype
{
private:
    WorkExprerience *workExp;

public:
    Resume(string name)
    {
        this->name = name;
        workExp = new WorkExprerience();
    }
    ~Resume()
    {
        if (workExp != NULL)
            delete workExp;
    }
    void SetPersonalInfo(string sex, string age)
    {
        this->sex = sex;
        this->age = age;
    }
    void SetWorkExperience(string workDate, string company)
    {
        workExp->setCompany(company);
        workExp->setWorkDate(workDate);
    }
    void Display()
    {
        cout << name << "  " << age << " " << sex << "  " << endl;
        cout << "工作经历  " << workExp->getWorkDate() << "  " << workExp->getCompany() << endl;
    }
    Resume &Clone()
    {
        Resume *clonedResume = new Resume(name);
        clonedResume->SetPersonalInfo(sex, age);
        return *clonedResume;
    }
};

int main()
{
    Resume *a = new Resume("big bird");
    a->SetPersonalInfo("MAN", "22");
    a->SetWorkExperience("1998-2000", "baidu");

    Resume b = a->Clone();
    b.SetWorkExperience("2000-2008", "google");

    Resume c = a->Clone();
    c.SetWorkExperience("2010-2018", "apple");

    a->Display();
    b.Display();
    c.Display();

    return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    char workDate[50];
    char company[50];
} WorkExperience;

typedef struct
{
    char name[50];
    char sex[10];
    char age[10];
    char timeArea[50];
    char company[50];
} PersonalInfo;

typedef struct Resume Resume;
struct Resume
{
    PersonalInfo info;
    WorkExperience *workExp;
    void (*display)(Resume *);
    Resume *(*clone)(Resume *);
};

void DisplayResume(Resume *resume);
Resume *CloneResume(Resume *original);

void InitWorkExperience(WorkExperience *exp)
{
    strcpy(exp->workDate, "");
    strcpy(exp->company, "");
}

void SetWorkExperience(WorkExperience *exp, const char *date, const char *company)
{
    strcpy(exp->workDate, date);
    strcpy(exp->company, company);
}

void DisplayWorkExperience(const WorkExperience *exp)
{
    printf("工作经历  %s  %s\n", exp->workDate, exp->company);
}

Resume *CreateResume(const char *name)
{
    Resume *resume = (Resume *)malloc(sizeof(Resume));
    strcpy(resume->info.name, name);
    strcpy(resume->info.sex, "");
    strcpy(resume->info.age, "");
    strcpy(resume->info.timeArea, "");
    strcpy(resume->info.company, "");
    resume->workExp = (WorkExperience *)malloc(sizeof(WorkExperience));
    InitWorkExperience(resume->workExp);
    resume->display = DisplayResume;
    resume->clone = CloneResume;
    return resume;
}

void DestroyResume(Resume *resume)
{
    if (resume)
    {
        if (resume->workExp)
            free(resume->workExp);
        free(resume);
    }
}

void SetPersonalInfo(Resume *resume, const char *sex, const char *age)
{
    strcpy(resume->info.sex, sex);
    strcpy(resume->info.age, age);
}

void SetWorkExperienceForResume(Resume *resume, const char *date, const char *company)
{
    SetWorkExperience(resume->workExp, date, company);
}

void DisplayResume(Resume *resume)
{
    printf("%s  %s %s  \n", resume->info.name, resume->info.age, resume->info.sex);
    DisplayWorkExperience(resume->workExp);
}

Resume *CloneResume(Resume *original)
{
    Resume *cloned = CreateResume(original->info.name);
    strcpy(cloned->info.sex, original->info.sex);
    strcpy(cloned->info.age, original->info.age);
    SetWorkExperienceForResume(cloned, original->workExp->workDate, original->workExp->company);
    return cloned;
}

int main()
{
    Resume *a = CreateResume("big bird");
    SetPersonalInfo(a, "MAN", "22");
    SetWorkExperienceForResume(a, "1998-2000", "baidu");

    Resume *b = a->clone(a);
    SetWorkExperienceForResume(b, "2000-2008", "google");

    Resume *c = a->clone(a);
    SetWorkExperienceForResume(c, "2010-2018", "apple");

    a->display(a);
    b->display(b);
    c->display(c);

    DestroyResume(a);
    DestroyResume(b);
    DestroyResume(c);

    return 0;
}

总结

在这里插入图片描述
关键在于实现一个Clone函数!!!
与拷贝构造函数相比就是:方便扩展,动态灵活定义拷贝行为(而且可被继承)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1824287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《站在2024年的十字路口:计算机专业是否仍是高考生的明智之选?》

文章目录 每日一句正能量前言行业竞争现状行业饱和度和竞争激烈程度[^3^]新兴技术的影响[^3^]人才需求的变化[^3^]行业创新动态如何保持竞争力 专业与个人的匹配度判断专业所需的技术能力专业核心课程对学生的要求个人兴趣和性格特点专业对口的职业发展要求实践和经验个人价值观…

redis的四种模式部署应用

这里写目录标题 redis应用redis单机部署redis主从redis哨兵Cluster模式 redis应用 redis单机部署 关闭防火墙[rootzyq ~]#: yum -y install wget make gcc gcc-c ...... [rootzyq ~]#: wget https://download.redis.io/redis-stable.tar.gz --2024-01-01 19:41:14-- https:/…

qemu创建kvm虚拟机-x86模拟arm

1、虚拟机环境 虚拟机ubuntu22.042、下载需要的依赖 apt install openssh-server net-tools vim -yapt install qemu qemu-kvm qemu-system-arm bridge-utils uml-utilities qemu-efi-aarch64 cloud-image-utils -y#查看版本 qemu-img -V(1) 下载uefi固件 cd /optwget https…

tcp协议机制的总结(可靠性,提高性能),基于tcp的应用层协议,用udp如何实现可靠传输

目录 总结 引入 可靠性 ​编辑 分析 三次握手 提高性能 其他 常见的基于tcp应用层协议 用udp实现可靠传输 总结 引入 为什么tcp要比udp复杂的多? 因为它既要保证可靠性,又要兼顾性能 可靠性 分析 其中,序列号不止用来排序,还可以用在重传时去重 确认应答是机制中的…

中小制造业工厂要不要上MES系统

MES系统的主要功能包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等。通过这些模块&#xff0c;MES为企业打造一个…

前端菜鸡流水账日记 -- pnpm的学习

哈咯哇大家&#xff0c;我又来了&#xff0c;最近稍微悠闲一些&#xff0c;所以就趁着这个机会学习一些新的知识&#xff0c;今天就是碰巧遇到了pnm&#xff0c;这个可以看作是npm的升级版本&#xff0c;比npm要快&#xff0c;用起来也更得劲更迅速 官网地址&#xff1a;https…

Java ORM 双雄:Mybatis vs Hibernate 的技术对决

引言&#xff1a;本文将对 MyBatis 和H ibernate 进行全面比较&#xff0c;探讨它们在各个方面的异同以及在实际项目中的应用场景。我们将从基本概念、工作原理、配置方式、性能表现、灵活性、学习曲线等多个方面进行比较&#xff0c;帮助读者更好地理解并选择适合自己项目需求…

每日一题——Python实现PAT乙级1028 人口普查 Keyboard(举一反三+思想解读+逐步优化)六千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 题目链接​编辑我的写法 专业点评 时间复杂度分析 空间复杂度分析 总结 我要更强…

Windows 11 中安装 Docker Desktop 并安装镜像

本该主要介绍在 Windows 11 中安装 Docker Desktop 时的一些准备工作&#xff0c;以及该如何下载和安装&#xff0c;然后分别使用管理界面和 Docker 命令安装两个镜像。 一、准备工作 在 Windows 11 中安装 Docker Desktop 前&#xff0c;需要做一些准备。打开 【Windows 功能…

R语言数据分析案例28-对数据集可视化和T检验

一、分析主题&#xff1a; 本分析旨在对数据集进行可视化和 T 检验&#xff0c;以探索数据集中的变量之间的关系和差异。通过可视化数据&#xff0c;我们可以直观地了解数据的分布和趋势&#xff0c;而 T 检验则可以帮助我们确定这些差异是否具有统计学意义。 二、具体分析 …

【CS.AL】算法必学之贪心算法:从入门到进阶 —— 关键概念和代码示例

文章目录 1. 概述2. 适用场景3. 设计步骤4. 优缺点5. 典型应用6. 题目和代码示例6.1 简单题目&#xff1a;找零问题6.2 中等题目&#xff1a;区间调度问题6.3 困难题目&#xff1a;分数背包问题 7. 题目和思路表格8. 总结References 1000.1.CS.AL.1.4-核心-GreedyAlgorithm-Cre…

ATF是如何完成双系统切换的?

ATF&#xff08;Arm Trusted Firmware&#xff09;是一个用于ARM架构处理器的可信固件&#xff0c;它最初提供的最主要的功能就是&#xff1a;双系统切换和电源管理。 那么如何进行双系统切换呢&#xff0c;在双系统切换的示例中&#xff0c;除了CPU的跳转&#xff0c;例如CPU…

【面试干货】Java集合类详解:List、Set、Queue、Map、Stack的特点与用法

【面试干货】Java集合类详解&#xff1a;List、Set、Queue、Map、Stack的特点与用法 1、Map1.1 特点1.2 用法1.3 常见的实现类 2、Set2.1 特点2.2 用法2.3 常见的实现类 3、List3.1 特点3.2 用法3.3 常见的实现类 4、Queue4.1 特点4.2 用法4.3 常见的实现类 5、Stack5.1 特点5.…

瀑布流布局:图片浏览页面

目录 任务描述 相关知识 HTML(HyperText Markup Language) 瀑布流布局&#xff1a; 题目 任务描述 在本关中&#xff0c;你的任务是理解瀑布流布局&#xff0c;以展示多张图片。瀑布流布局使得图片能够按照设定的列数依次排列&#xff0c;每列的高度会根据图片的高度自动调…

【单片机毕业设计选题24007】-基于STM32和阿里云的家庭健康数据监测系统

系统功能: 本课题设计是基于STM32单片机作为控制主体&#xff0c;通过HX711称重模块&#xff0c;HC-SR04超声波测距模块&#xff0c;红外测温&#xff0c;心率传感器等模块通过I2C或SPI接口与STM32进行通信&#xff0c;并读取传感器输出的身高&#xff0c;体重&#xff0c;心率…

一年前 LLM AGI 碎片化思考与回顾系列④ · 从System2→Post-training的疑虑和思考

阅读提示&#xff1a; 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成&#xff0c;在内容上&#xff0c;与不久前刚刚完稿的那篇10万字文章 「融合RL与LLM思想&#xff0c;探寻世界模型…

B+索引的分裂及选择率和索引基数

1、B树索引的分裂 B树索引页的分裂并不总是从页的中间记录开始&#xff0c;这样可能会导致页空间的浪费。 例子 比如下面这个记录&#xff1a; 1、2、3、4、5、6、7、8、9 由于插入是以自增的顺序进行的&#xff0c;若这时插入第10条记录然后进行页的分裂操作&#xff0c;那…

QChar转换为Unicode,判断数字、字母、符号、标点

实现 QChar转换为Unicode&#xff0c;判断数字、字母、符号、标点等 #include "widget.h" #include "ui_widget.h" #include "QMessageBox"widget::widget(QWidget *parent): QWidget(parent), ui(new Ui::widget) {ui->setupUi(this); }widg…

Java 网站开发入门指南:如何用java写一个网站

Java 网站开发入门指南&#xff1a;如何用java写一个网站 Java 作为一门强大的编程语言&#xff0c;在网站开发领域也占据着重要地位。虽然现在 Python、JavaScript 等语言在网站开发中越来越流行&#xff0c;但 Java 凭借其稳定性、可扩展性和丰富的生态系统&#xff0c;仍然…

TF-IDF算法详细介绍

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种用于信息检索和文本挖掘的统计方法&#xff0c;旨在评估一个词在文档集合或语料库中的重要性。它是计算机科学和文本分析中最常用的特征提取技术之一。本文将详细介绍TF-IDF的基本概念、计算方法…