不得不的创建型模式-原型模式

news2024/9/20 14:29:01

原型模式是一种创建型模式,它通过复制一个已有对象来创建新的对象,而无需知道新对象的具体类型。

原型模型的结构:

 下面是一个简单的C++实现原型模式的代码示例:

#include <iostream>
#include <string>
#include <unordered_map>

class Prototype {
public:
    virtual Prototype* clone() = 0;
    virtual void print() = 0;
    virtual ~Prototype() {};
};

class ConcretePrototype1 : public Prototype {
public:
    Prototype* clone() {
        return new ConcretePrototype1(*this);
    }
    void print() {
        std::cout << "ConcretePrototype1" << std::endl;
    }
};

class ConcretePrototype2 : public Prototype {
public:
    Prototype* clone() {
        return new ConcretePrototype2(*this);
    }
    void print() {
        std::cout << "ConcretePrototype2" << std::endl;
    }
};

class PrototypeFactory {
public:
    Prototype* getPrototype(std::string type) {
        if (prototypes.find(type) != prototypes.end()) {
            return prototypes[type]->clone();
        }
        return nullptr;
    }
    void addPrototype(std::string type, Prototype* prototype) {
        prototypes[type] = prototype;
    }
private:
    std::unordered_map<std::string, Prototype*> prototypes;
};

int main() {
    PrototypeFactory factory;

    ConcretePrototype1* prototype1 = new ConcretePrototype1();
    factory.addPrototype("Prototype1", prototype1);

    ConcretePrototype2* prototype2 = new ConcretePrototype2();
    factory.addPrototype("Prototype2", prototype2);

    Prototype* clone1 = factory.getPrototype("Prototype1");
    Prototype* clone2 = factory.getPrototype("Prototype2");

    clone1->print(); // 输出:ConcretePrototype1
    clone2->print(); // 输出:ConcretePrototype2

    delete prototype1;
    delete prototype2;
    delete clone1;
    delete clone2;

    return 0;
}

在上面的代码中,我们定义了一个抽象基类Prototype,并让ConcretePrototype1ConcretePrototype2类分别实现它,它们分别代表了我们要复制的两种对象。PrototypeFactory类是工厂类,它管理着所有原型对象的集合,并提供了一些方法来获取原型对象和添加原型对象。在getPrototype方法中,我们根据传入的类型字符串从原型集合中获取相应的原型对象,并调用其clone方法来复制它。

面试中可能遇到的问题:

  1. 什么是原型模式?

原型模式是一种创建型模式,它允许我们通过复制一个已有对象来创建新的对象,而无需知道新对象的具体类型。

  1. 2原型模式的工作原理是什么?

原型模式通过将已有对象进行复制来创建新的对象,其中需要注意的是,对于复制出来的对象,它们的成员变量的值与原型对象是相同的,但是它们是不同的对象,拥有不同的内存地址。

  1. 3请给出一个使用原型模式的实例?

假设我们需要在程序中使用一个存储单元信息的类,我们可以先创建一个该类的原型对象,然后通过复制这个原型对象来创建新的存储单元对象,避免每次创建新的存储单元时都需要重新初始化对象的成员变量。

  1. 4原型模式的优点和缺点是什么?

优点:

  • 可以避免重复的对象创建,提高对象的创建效率。
  • 可以动态添加和删除原型对象。
  • 可以简化对象的创建过程,避免过多的初始化操作。

缺点:

  • 如果原型对象的初始化操作比较复杂,那么每次复制都会执行这些操作,导致性能下降。
  • 原型模式需要深拷贝实现对象的复制,如果对象的成员变量存在指针,那么需要自己实现深拷贝,增加了开发的难度。
  1. 5在实现原型模式时,你需要注意哪些问题?

在实现原型模式时,需要注意以下问题:

  • 需要实现对象的深拷贝,保证复制出来的对象与原型对象是不同的对象。
  • 需要提供克隆方法,用于复制对象。
  • 原型对象需要具有足够的通用性,以便能够被复制。
  1. 6原型模式和其他创建型模式有什么区别?

原型模式是一种基于复制的创建型模式,它通过复制已有对象来创建新的对象。而其他创建型模式则主要是通过类的继承、工厂方法、抽象工厂等方式来创建对象。另外,原型模式通常用于创建较为简单的对象,而其他创建型模式则适用于创建更加复杂的对象。

  1. 7原型模式和单例模式有什么区别?

原型模式和单例模式都属于创建型模式,但是它们的目的和应用场景不同。原型模式的主要目的是通过复制已有对象来创建新的对象,而单例模式的主要目的是确保某个类只有一个实例。另外,原型模式可以创建多个对象,每个对象的成员变量的值都可以不同,而单例模式则只能创建一个对象,该对象的成员变量的值是唯一的。

  1. 8在实际项目中,你使用过原型模式吗?可以分享一下经验吗?

我曾在一个银行系统项目中使用过原型模式。在该项目中,我们需要创建多个账户对象,这些账户对象的属性都是相似的,只是账户名称、账户余额等信息有所不同。为了避免重复的对象创建,我们使用了原型模式来创建账户对象。我们首先创建一个账户原型对象,然后通过复制该对象来创建新的账户对象,避免了重复的初始化操作。使用原型模式不仅提高了对象的创建效率,而且也简化了代码的实现,提高了代码的可读性。

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

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

相关文章

React markdown 编辑器

react-markdown 是一款 github 上开源的适用于 react 的 markdown 组件&#xff0c;可以基本实现 markdown 的功能&#xff0c;且可以根据自己实际应用定制的 remark 组件。 安装 安装 markdown 预览插件 react-markdown npm install react-markdown或者&#xff1a; yarn …

Flask+mysql简单问答网站(实现公网可访问)

先到github下载仓库文件 https://github.com/QHCV/flask_mysql_blog python版本3.8&#xff0c;提前安装好Mysql数据库 1.安装python包 pip install -r requirements.txt2.修改配置文件config.py Mysql数据库用户名和密码用于发送验证码的邮箱配置 ​ 在设置->账户下开…

数仓建设规划核心问题!

小A进入一家网约车出现服务公司&#xff0c;负责公司数仓建设&#xff0c;试用期主要一项 OKR是制定数据仓库建设规划&#xff1b;因此小 A 本着从问题出发为原点&#xff0c;先对公司数仓现状进行一轮深入了解&#xff0c;理清存在问题&#xff0c;然后在以不忘初心原则提出解…

提取文本的摘要snownlp模块

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 提取文本的摘要 snownlp模块 [太阳]选择题 关于以下python代码说法错误的一项是&#xff1f; from snownlp import SnowNLP myText """ChatGPT的出现标志着人类科技发…

CSS3 grid网格布局

文章目录 CSS3 grid网格布局概述grid属性说明使用grid-template-rows & grid-template-columns 定义行高和列宽grid-auto-flow 定义项目的排列顺序grid-auto-rows & grid-auto-columns 定义多余网格的行高和列宽row-gap & column-gap 设置行间距和列间距gap 简写形…

Java版spring cloud 本工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业&#xff08;以下简称工程项目管理企业&#xff09;受业主委托&#xff0c;按照合同约定&#xff0c;代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈&#xff0c;内卷严重&#xff0c…

Leetcode605. 种花问题

Every day a leetcode 题目来源&#xff1a;605. 种花问题 解法1&#xff1a;贪心 贪心思想&#xff1a;在不打破种植规则的情况下种入尽可能多的花&#xff0c;然后用“最大种植数量”和“所需要种植数量”进行大小比较即可。 设地块长度为n&#xff0c;种花的情况可分为4…

分享一个菜单标签页动画,切换丝滑无比

先上效果图: 代码如下,复制粘贴大法拿走即可使用: <!DOCTYPE html> <html lang="en"> <head>

win系统使用frp端口映射实现内网穿透,配置“任务计划程序”提高稳定性

Github下载最新版frp: https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_windows_amd64.zip 解压把frpc.exe和frpc.ini放到D:\program\frp目录下&#xff0c;修改frpc.ini内容如下&#xff1a; [common] server_addr 服务器域名或IP&#xff0c;假设…

Dockerfile镜像LNMP的实战

Dockerfile镜像LNMP的实战 环境准备关闭防火墙拉取centos:7镜像自定义网络 部署nginx&#xff08;容器IP 为 172.18.0.10&#xff09;部署mysql&#xff08;容器IP 为 172.18.0.20&#xff09;部署php&#xff08;容器IP 为 172.18.0.30&#xff09; 环境准备 关闭防火墙 [ro…

taro之项目初始化模板

项目初始化模板 一直以来&#xff0c;在使用 Taro CLI 的 taro init 命令创建项目时&#xff0c;CLI 会提供若干内置模板给开发者选择。但是很多团队都有自己独特的业务场景&#xff0c;需要使用和维护的模板也不尽一致&#xff0c;因此 Taro 支持把项目模板打包成一个能力赋予…

JavaScript奇技淫巧:debugger拦截

debugger指令&#xff0c;一般用于调试&#xff0c;在如浏览器调试执行环境中&#xff0c;可以在JavaScript代码中产生中断。 如果想要拦截debugger&#xff0c;是不容易的&#xff0c;常用的函数替代、proxy方法均对它无效&#xff0c;如&#xff1a; window.debugger (fun…

电脑音乐相册软件推荐 电脑音乐相册制作方法

音乐相册就是把照片剪辑成视频&#xff0c;并配上动听的音乐。音乐相册很适合保存照片&#xff0c;记录生活&#xff0c;传达出拍摄者当时的心情。下面为大家带来电脑音乐相册软件推荐&#xff0c;电脑音乐相册制作方法。 一、电脑音乐相册软件推荐 很多小伙伴在制作音乐相册…

大数据Doris(三):Apache Doris分布式部署准备工作

文章目录 Apache Doris分布式部署准备工作 一、Apache Doris下载 二、节点划分 三、节点配置 1、设置文件句柄数 2、时间同步 3、关闭 Swap 分区 4、调大单个进程的虚拟内存区域数量 Apache Doris分布式部署准备工作 部署Apache Doris时需要分别部署FE、BE、Broker。然…

iOS - RunLoop 基本原理介绍

一、Runloop 简介 Runloop 是通过内部维护事件循环来对事件/消息进行管理的一个对象。 事件循环&#xff08;状态切换&#xff09; 没有消息需要处理时&#xff0c;休眠以避免资源占用&#xff08;用户态 -> 内核态&#xff09;有消息需要处理时&#xff0c;立刻被唤醒&a…

电视盒子什么牌子好?数码博主盘点2022电视盒子排行榜

网络电视盒子是电视机的标配&#xff0c;开放性的安卓系统能观看海量视频资源&#xff0c;我每年也会进行电视盒子的测评&#xff0c;今天要来分享五款最热门的网络电视盒子推荐&#xff0c;跟着我一起看看网络电视盒子哪个好。 一&#xff1a;泰捷WEBOX60Pro电视盒子 年度…

【华为HCIP | 高级网络工程师】刷题日记(1)

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;落. &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️ 零基础…

03-stable diffusion国风小姐姐

stable diffusion 文生图 – 生成国风小姐姐 一、模型在哪里下载 下载网站civitai&#xff1a; Civitai | Stable Diffusion models, embeddings, LoRAs and more国风主模型&#xff1a;https://civitai.com/models/14171/cutegirlmix4主模型放到sd-webui-aki-v4\models\Stab…

【AUTOSAR】【信息安全】CSM

目录 一、概述 二、依赖模块 三、功能描述 3.1 基本体系结构 3.2 通用行为 3.2.1 正常操作 3.2.2 设计说明 3.3 错误分类 3.3.1 开发错误 3.3.2 运行时错误 四、API接口 4.1 通用接口 4.2 加密接口 4.3 秘钥接口 4.4 Job接口 4.5 回调接口 4.6 调度接口 一、概…

配置中心基本原理

配置中心是如何实现推送的&#xff1f; 背景 传统的静态配置方式想要修改某个配置时&#xff0c;必须重新启动一次应用&#xff0c;如果是数据库连接串的变更&#xff0c;那可能还容易接受一些&#xff0c;但如果变更的是一些运行时实时感知的配置&#xff0c;如某个功能项的…