设计模式5、原型模式 Prototype

news2024/11/30 20:41:02

解释说明:使用原型实例指定待创建对象的类型,并且通过复制这个原型阿里创建型的对象

UML 结构图:

抽象原型(Prototype):规定了具体原型对象必须实现的clone()方法

具体原型(ConcretePrototype):实现抽象原型类的clone()方法,它是可被复制的对象

访问类:使用具体原型类中的clone()方法来复制新的对象。

浅拷贝:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址

深拷贝:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址

优点:

    如果创建新的对象比较复杂,可以利用原型模式简化对象的创建过程,同时也能够提高效率。

    简化对象的创建,无需理会创建过程。

    可以在程序运行时(对象属性发生了变化)获得一份内容相同的实例,他们之间不会相互干扰。

缺点:

    在实现深拷贝时可能需要比较复杂的代码

    需要为每一个类配备一个克隆方法,而且该克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事,必须修改其源代码,违背了“开闭原则”。

适用场景

    如果创建新对象成本较大,可以利用已有的对象进行复制来获得。

    如果系统要保存对象的状态,而对象的状态变化很小,或者对象本身占内存不大的时候,也可以使用原型模式配合备忘录模式来应用。相反,如果对象的状态变化很大,或者对象占用的内存很大,那么采用状态模式会比原型模式更好。

    需要避免使用分层次的工厂类来创建分层次的对象,并且类的实例对象只有一个或很少的几个组合状态,通过复制原型对象得到新实例可能比使用构造函数创建一个新实例更加方便

#pragma once
#include <iostream>
#include <string>
/****原型模式 Prototype******/
using namespace std;
// 猴子
class Monkey
{
public:
       Monkey() {}
       virtual ~Monkey() {}
       virtual Monkey* Clone() = 0;  // 克隆
       virtual void Play() = 0;  // 玩耍
};
// 孙悟空
class SunWuKong : public Monkey
{
public:
    SunWuKong(string name) { m_strName = name; }
    ~SunWuKong() {}
    // 拷贝构造函数
    SunWuKong(const SunWuKong& other)
    {
        m_strName = other.m_strName;
    }
    Monkey* Clone()
    {
        // 调用拷贝构造函数
        return new SunWuKong(*this);
    }
    void Play()
    {
        cout << m_strName << " play Golden-Hoop-Stick" << endl;
    }
private:
    string m_strName;
};

#include "prototype.h"
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
int main()
{
       // 孙悟空
       Monkey* pSWK = new SunWuKong("Qi Tian Da Sheng");
       // 克隆猴子猴孙
       Monkey* pSWK1 = pSWK->Clone();
       Monkey* pSWK2 = pSWK1->Clone();
       pSWK1->Play();
       pSWK2->Play();
       SAFE_DELETE(pSWK1);
       SAFE_DELETE(pSWK2);
       SAFE_DELETE(pSWK);
       getchar();
       return 0;
}

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

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

相关文章

CVE-2023-5129 libwebp堆缓冲区溢出漏洞影响分析

漏洞简述 近日苹果、谷歌、Mozilla和微软等公司积极修复了libwebp组件中的缓冲区溢出漏洞&#xff0c;相关时间线如下&#xff1a; 9月7日&#xff0c;苹果发布紧急更新&#xff0c;修复了此前由多伦多大学公民实验室报告的iMessage 0-click 漏洞&#xff0c;漏洞被认为已经被…

爬取北京新发地当天货物信息并展示十五天价格变化(三)---获取物品十五天内的价格

。。。。。。。。。。。。。。。。。。。。。。 1.网页请求一下内容2.通过爬虫进行请求3.获取商品十五天详细数据并绘制折线图4.项目详细代码 1.网页请求一下内容 通过抓包我们发现一共七个参数 limit: 20 # 一页多少数据 current: …

自制代码编辑器:CASM Editor

哔哩哔哩演示视频&#xff1a;我使用python自制了一个代码编辑器——CASM Editor_哔哩哔哩_bilibili 源代码&#xff1a; import idlelib.colorizer as idc import idlelib.percolator as idp import os import sys import threading import time import tkinter as T_tk imp…

计算机视觉: 可控的高质量人体生成

背景 关于人体动作的生成范式目前主流的方向可以分为以下两种: Sequence based motion generation: 给定控制信号然后一次性生成连续的动作&#xff0c;能生成一些连续高阶语义的动作信号&#xff0c;因为其能看到整个动作信号。eg: MDM: Human Motion Diffusion Model, Teve…

机器学习(20)---神经网络详解

神经网络 一、神经网络概述1.1 神经元模型1.2 激活函数 二、感知机2.1 概述2.2 实现逻辑运算2.3 多层感知机 三、神经网络3.1 工作原理3.2 前向传播3.3 Tensorflow实战演示3.3.1 导入数据集查看3.3.2 数据预处理3.3.3 建立模型3.3.4 评估模型 四、反向传播五、例题5.1 题15.2 题…

【SQL】Mysql 时区设置解决--20230928

https://blog.csdn.net/qq_44392492/article/details/108717616 输入命令show variables like “%time_zone%”;&#xff08;注意分号结尾&#xff09;设置时区&#xff0c;输入 set global time_zone “8:00”; 回车,然后退出重启&#xff08;一定记得重启&#xff0c;不然查…

Mysql 本地计算机无法启动 mysql 服务 错误 1067:进程意外终止

有时候一段时间本地mysql不用&#xff0c;在连接本地数据库的时候&#xff0c;会报mysql无法连接出现错误提示10061错误&#xff0c; 这时候一般是本地mysql服务没有启动 去左下角搜“服务”&#xff0c;进入后选择Mysql&#xff0c;点击启动&#xff08;我的截图是已经启动好…

C#,数值计算——Ranfib的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Implements Knuths subtractive generator using only floating operations. See /// text for cautions. /// </summary> public class Ranfib { p…

通过茶叶酒水小程序商城的作用是什么?

茶叶酒水往往会在一起经营&#xff0c;同时又具备较强的送礼属性&#xff0c;需求度较高但经营商家同样不少&#xff0c;同行竞争激烈&#xff0c;加之同城生意有限、外地客户难以拓展、销售营销不足、品牌宣传效果差等痛点&#xff0c;传统酒水茶叶门店需要线上带来增长。 那…

大数据Flink(九十二):DML:集合操作

文章目录 DML:集合操作 DML:集合操作 集合操作支持 Batch\Streaming 任务。 UNION:将集合合并并且去重。

uni-app:js修改元素样式(宽度、外边距)

效果 代码 1、在<view>元素上添加一个ref属性&#xff0c;用于在JavaScript代码中获取对该元素的引用&#xff1a;<view ref"myView" id"mybox"></view> 2、获取元素引用 &#xff1a;const viewElement this.$refs.myView.$el; 3、修改…

【Flink】

事件驱动型应用 核心目标&#xff1a;数据流上的有状态计算 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界或有界数据流进行有状态计算。 运行逻辑 状态 把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“…

mrctf2020_shellcode_revenge

mrctf2020_shellcode_revenge Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX disabled PIE: PIE enabled RWX: Has RWX segments64位&#xff0c;开了PIE和RELRO&#xff0c;看到RWX出来&#xff0c;就感觉是shellcode了…

如何使用PyInstaller打包Python应用(包含参数详解,spec文件详解,反编译和防止反编译)

文章目录 介绍PyInstaller安装PyInstaller参数及使用方法PyInstaller打包技巧和注意事项反编译和防止反编译介绍PyInstaller PyInstaller是一个强大的Python打包工具,它可以将Python程序打包成独立的可执行文件,方便在不同的操作系统上分发和运行。使用PyInstaller,你可以将…

react.js在visual code 下的hello World

想学习reacr.js &#xff0c;就开始做一个hello world。 我的环境是visual code &#xff0c;所以我找这个环境下的例子。参照&#xff1a; https://code.visualstudio.com/docs/nodejs/reactjs-tutorial 要学习react.js &#xff0c;还得先安装node.js&#xff0c;我在visual …

Mysql高级语句(进阶查询语句、数据库函数、连接查询)

Mysql高级语句&#xff08;进阶查询语句、MySQL数据库函数、连接查询 一、mysql查询语句1.1、 select ----显示表格中一个或数个字段的所有数据记录1.2、 distinct ----不显示重复的数据记录1.3、where ----有条件查询1.4、 and or ----且 或1.5 、in----显示已知的值的数据记录…

9_分类算法—决策树

文章目录 1 信息熵1.1 比特化&#xff08;Bits&#xff09;1.2 一般化的比特化&#xff08;Bits&#xff09;1.3 信息熵&#xff08;Entropy&#xff09;1.3.1 熵越大混乱程度越大 1.4 条件熵H&#xff08;YIX&#xff09; 2 决策树2.1 什么是决策树2.2 决策树构建过程&#xf…

MySQL 索引的作用、索引结构及执行流程介绍(索引篇 一)

索引介绍 MySQL索引&#xff08;index&#xff09;是一种用于加快数据库中数据搜索和查询的数据结构。它类似于书籍的目录&#xff0c;可以帮助数据库快速定位和访问特定数据&#xff0c;而无需扫描整个数据表。 索引的作用和缺点 1. 加快数据搜索&#xff1a;通过使用索引&…

《C++ Primer》练习7.31:定义互相嵌套的类

类可以先声明再定义&#xff0c;可以用下面这个题目理解一下 class Y; class X {Y *y; };class Y {X x; };未出现的类类型要在前面声明。 参考 《C Primer》

0x84加密数据传输服务

为了在安全模式下实现一些诊断服务&#xff0c;在服务端和客户端应用程序之间添加了Security sub-layer。在客户端与服务端之间进行诊断服务数据传输有两种方法&#xff1a; 1、非安全模式下数据传输   应用程序使用诊断服务(diagnostic Services)和应用层服务原语(Applicati…