设计模式11-原型模式

news2024/11/24 3:56:43

设计模式11-原型模式

  • 写在前面
    • 对象创建模式
    • 典型模式
      • 原型模式
        • 动机
        • 结构
        • 代码推导
        • 应用
        • 特点
        • 要点总结
      • 原型模式与工厂方法模式对比
        • 工厂方法模式
        • 原型模式
        • 什么时候用什么模式

写在前面

对象创建模式

通过对象创建模式绕开动态内存分配来避免创建过程中所导致的耦合过紧的问题。从而支持对象创建的稳定,它是接口抽象之后的第一步工作。

典型模式

  • 工厂方法模式
  • 抽象工厂模式
  • 原型模式
  • 构建器

原型模式

动机

在某些情况下,创建一个新对象的过程可能非常复杂或代价高昂。通过复制一个现有的对象(即原型),我们可以快速创建新的对象,并且可以对复制的对象进行独立修改。这种方式特别适用于需要频繁创建相似对象的场景。

结构

在这里插入图片描述

  1. Prototype(原型): 声明一个克隆自身的接口。
  2. ConcretePrototype(具体原型): 实现克隆方法,以便创建自己的副本。
  3. Client(客户端): 通过调用原型的克隆方法来创建新的对象。
代码推导

就是将工厂模式中的创建对象的接口,移到同一个类中,并进行深拷贝的方式创建对象

下面是一个简单的原型模式示例:

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

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

// Concrete Prototype
class ConcretePrototype : public Prototype {
private:
    string field;

public:
    ConcretePrototype(const string& field) : field(field) {}
    ConcretePrototype(const ConcretePrototype& other) : field(other.field) {}

    Prototype* clone() const override {
        return new ConcretePrototype(*this);
    }

    void print() const override {
        cout << "ConcretePrototype with field: " << field << endl;
    }
};

// Client Code
int main() {
    ConcretePrototype prototype1("Value1");
    Prototype* prototype2 = prototype1.clone();

    prototype1.print();
    prototype2->print();

    delete prototype2;
    return 0;
}

在这个例子中,ConcretePrototype实现了Prototype接口并提供了一个clone方法来复制自身。客户端代码通过调用clone方法创建了一个ConcretePrototype对象的副本。

应用

原型模式适用于以下场景:

  • 当一个系统需要独立于其产品创建、构成和表示时。
  • 当要实例化的类是由某个运行时动态加载的类时。
  • 为了避免使用new操作符直接创建对象。
  • 当一个类的实例化过程非常复杂或代价高昂时(如需要大量初始化资源)。
特点
  • 优点:
    • 可以在不暴露具体实现细节的情况下快速创建对象。
    • 减少创建对象的成本(尤其是创建对象过程复杂或代价高昂时)。
    • 允许动态增加或减少产品种类。
  • 缺点:
    • 需要为每一个类配备一个克隆方法,这可能会增加代码复杂性。
    • 深拷贝和浅拷贝的实现需要仔细考虑,尤其是在涉及到复杂对象时。
要点总结
  • 原型模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,同样要求这些异变类拥有稳定的接口。
  • 原型模式对于如何创建异变类的实体对象,采用原型克隆的方法来做。它使得我们可以非常灵活的动态创建。拥有某些稳定接口的新对象。所需工作仅仅是注册一个新类的对象即原型,然后在任何需要的地方克隆。
  • 原型模式中的克隆方法可以利用某些框架中的序列化,来实现深拷贝。

原型模式与工厂方法模式对比

工厂方法模式
  • 动机: 通过定义一个创建对象的接口,由子类决定实例化的类是哪一个。这样,工厂方法把实例化的过程推迟到子类。
  • 优点: 避免了在客户端代码中显式使用new操作符,符合开闭原则。
  • 应用场景: 适用于实例化的类可能经常变化的情况,通过工厂方法可以灵活地改变产品的实例化方式。
原型模式
  • 动机: 通过复制现有对象来创建新对象,而不是通过类构造函数实例化对象。适用于需要频繁创建相似对象的场景。
  • 优点: 可以快速创建对象,减少创建对象的成本。
  • 应用场景: 适用于创建对象过程复杂或代价高昂,需要频繁创建相似对象的情况。
什么时候用什么模式
  • 使用工厂方法模式: 当你需要将实例化过程推迟到子类并希望子类决定要创建的类是哪一个时。工厂方法模式通过继承和多态来实现对象的创建。
  • 使用原型模式: 当你需要快速创建对象并且这些对象具有相似的属性时。原型模式通过克隆现有对象来实现对象的创建。

总的来说,如果对象创建过程复杂且创建开销大,或者对象是从一个繁重的构造函数生成的,那么使用原型模式更为合适。如果需要灵活地选择实例化的类并希望代码符合开闭原则,那么工厂方法模式是更好的选择。

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

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

相关文章

【devops】gitlab 实现cicd 实践

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

AWS服务器购买:如何选择合适的AWS云服务器

在当今数字化时代,云计算已成为企业IT基础设施的重要组成部分。作为全球领先的云服务提供商之一,亚马逊网络服务(AWS)提供了丰富多样的云服务器选项。然而,面对众多选择,如何为您的业务需求挑选最合适的AWS云服务器呢?我们结合九河云的分析来给你解答。 1. 明确业务需求 首先…

前端Vue项目中腾讯地图SDK集成:经纬度与地址信息解析的实践

在前端开发中&#xff0c;我们经常需要将经纬度信息转化为具体的地址信息&#xff0c;这对于定位、地图展示等功能至关重要。Vue作为现代前端框架的代表&#xff0c;其组件化开发的特性使得我们能够更高效地实现这一功能。本文将介绍如何在Vue项目中集成腾讯地图SDK&#xff0c…

vue3 + antd vue 纯前端 基于xlsx 实现导入excel 转 json,将json数据转换XLSX并下载(下载模版)

一、导入 0、关键代码 // 安装插件 npm i xlsx/yarn add xlsx // 导入xlsx import * as XLSX from xlsx; 点击提交的时候才整理数据。上传的时候文件保存在 state.form.file[0] 中的 // 定义字段映射关系 const fieldMap {sheet2json: {技能名称: skill_name,技能等级: …

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.1物联网与2.2.2云计算

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

iPhone手机上备忘录怎么设置字数显示

在日常生活和工作中&#xff0c;我经常会使用iPhone的备忘录功能来记录一些重要的想法、待办事项或临时笔记。备忘录的便捷性让我可以随时捕捉灵感&#xff0c;但有时候&#xff0c;我也会苦恼于不知道自己记录了多少内容&#xff0c;尤其是在需要控制字数的时候。 想象一下&a…

mysql的B+树索引结构介绍

一、B树 特性&#xff1a; 所有的叶子结点中包含了全部关键字的信息&#xff0c;非叶子节点只存储键值信息&#xff0c;及指向含有这些关键字记录的指针&#xff0c;且叶子结点本身依关键字的大小自小而大的顺序链接&#xff0c;所有的非终端结点可以看成是索引部分&#xff0…

达梦数据库 MPP集群搭建(带主备)

MPP集群搭建&#xff08;带主备&#xff09; 1.背景2.操作内容和要求3. 具体步骤3.1 搭建过程3.1.1 集群搭建3.1.2 准备工作3.1.2.1 初始化3.1.2.2 备份数据库 3.1.3 配置主库EP013.1.3.1 配置dm.ini3.1.3.2 配置dmmal.ini3.1.3.3 配置dmarch.ini3.1.3.4 配置dmmpp.ctl3.1.3.5 …

Linux NFS服务搭建及使用

一、NFS 服务器介绍 nfs &#xff08; Network File System &#xff09;即网络文件系统&#xff0c;其基于 UDP/IP使用 nfs 能够在不同计算机之间通过网络进行文件共享&#xff0c;能使使用者访问网络上其它计算机中的文件就像在访问自己的计算机一样。 二、NFS 服务器的特点 …

【Java】用队列实现栈 力扣

文章目录 题目链接题目描述思路代码 题目链接 225.用队列实现栈 题目描述 思路 一个队列在模拟栈弹出元素的时候只要将队列头部的元素&#xff08;除了最后一个元素外&#xff09; 重新添加到队列尾部&#xff0c;此时再去弹出元素就是栈的顺序了。 代码 class MyStack {Q…

C++那些事之依赖注入

C那些事之依赖注入 最近星球里面有个小伙伴让更新一下依赖注入&#xff0c;于是写出了这篇文章&#xff0c;来从实际的例子讲解&#xff0c;本文会讲解一些原理与实现&#xff0c;完整的实现代码懒人版放在星球中&#xff0c;我们开始正文。 大纲&#xff1a; 直接依赖接口依赖…

什么是长效住宅IP?

长效住宅IP的定义 长效住宅IP&#xff0c;简而言之&#xff0c;是指长期稳定、非动态更换的住宅网络IP地址。这类IP地址通常由互联网服务提供商&#xff08;ISP&#xff09;分配给居民家庭用户&#xff0c;用于上网、网络通信等日常网络活动。与传统的动态IP相比&#xff0c;长…

​前端Vue组件技术实践:打造自定义精美悬浮菜单按钮组件

随着前端技术的迅猛发展&#xff0c;复杂的应用场景和不断迭代的产品需求使得开发的复杂度日益提升。传统的整体式开发方式已经难以满足现代前端应用的灵活性和可维护性需求。在这样的背景下&#xff0c;组件化开发逐渐崭露头角&#xff0c;成为解决复杂前端应用问题的有效手段…

算法第十一天:leetcode707.设计链表

一、设计链表的题目描述与链接 707.设计链表的链接如下表所示&#xff0c;您可直接复制下面网址进入力扣学习&#xff0c;在观看下面的内容之前一定要先做一遍哦&#xff0c;这样才能印象深刻&#xff01; https://leetcode.cn/problems/design-linked-list/https://leetcode.…

Java_Docker

镜像和容器&#xff1a; 镜像仓库&#xff1a; 存储和管理镜像的平台&#xff0c;镜像仓库中有非常多常用软件的镜像&#xff0c;Docker官方维护了一个公共仓库​​​​​​:​Docker Hub 部署MySQL&#xff1a; docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shang…

C/C++的堆栈内存分配详解

在C/C编程中&#xff0c;内存管理是至关重要的一个方面。理解内存的分配方式有助于编写高效、可靠的程序&#xff0c;C/C主要使用两种内存分配方式&#xff1a;堆&#xff08;heap&#xff09;和栈&#xff08;stack&#xff09;。这两者在管理方式、性能和使用场景上都有显著区…

RDMA软件架构

RDMA 的软件架构按层次可分成两部分&#xff0c;即 rdma-core 和内核 RDMA 子系统&#xff0c;分别运行在 Linux 系统中的用户态和内核态。整个软件架构适用于所有类型的 RDMA 网卡&#xff0c;不管网卡执行了哪种 RDMA 协议&#xff08;InfiniBand/RoCE/ iWARP&#xff09;。 …

[SUCTF 2019]EasySQL1

这是一个简单的SQL注入题&#xff0c;但是因为我的SQL基础约等于0&#xff0c;所以做起来很难。 首先试试引号是否被过滤 可以看到单引号、双引号都被过滤了&#xff0c;试试其他的盲注都不行&#xff0c;基本上可以确定不能用这种方法。 在测试的过程中发现&#xff0c;输入…

Python实现招聘数据采集 ,并做可视化分析

转眼秋招快到了&#xff0c; 今天来学习一下如何用Python采集全网招聘数据&#xff0c;并进行可视化分析&#xff0c;为就业准备~ 话不多说开始造 源码和详细的视频讲解我都打包好了&#xff0c;文末名片自取 准备工作 首先你需要准备这些 环境 Python 3.10 Pycharm 模块…

[解决方法]git上传的项目markdown文件的图片无法显示

应该有不少初学者会遇到这种情况 以下是本人摸索出的解决方法 我使用的是typora&#xff0c;首先设置typora的图片设置 文件>偏好设置>图像 如下&#xff1a; 选择这个就会在此文件的同级目录下创建一个assets文件夹来存放此markdown文件的所有图片 然后勾选优先使用相…