C++二十三种设计模式之原型模式

server/2025/1/8 22:52:08/

C++二十三种设计模式原型模式

  • 一、组成
  • 二、特点
  • 三、目的
  • 四、缺点
  • 五、示例代码

一、组成

抽象原型类:声明克隆接口。
具体原型类:实现克隆接口。

二、特点

1、通过具体原型类克隆的对象只是部分属性值不同。
2、克隆函数内部可用拷贝构造函数赋值。

三、目的

通过已有对象来复制新对象,不同对象之间仅部分属性有差异。

四、缺点

1、场景限制问题,如果对象内部存在循环引用或动态分配的资源会比较麻烦。
2、深拷贝和浅拷贝问题,对象有嵌套结构则需要复杂的深拷贝逻辑。

五、示例代码

#include<iostream>
#include <vector>
#include <list>
#include <string>
#include <mutex>
#include <map>
#include<stack>using namespace std;class Prototype;//抽象原型类
class BaseCharacter;//抽象类
class Player;//具体原型类
class Enemy;//具体原型类class Prototype {
public:Prototype() {}virtual shared_ptr<Prototype> clone() = 0;virtual void setHealth(int health) = 0;virtual void setAttack(int attack) = 0;virtual void setDefense(int defense) = 0;virtual void setName(string name) = 0;virtual void print() = 0;
};class BaseCharacter : public Prototype {
public:BaseCharacter() {}BaseCharacter(string name, int health, int attack, int defense) :m_name(name), m_health(health), m_attack(attack), m_defense(defense) {};void setHealth(int health) {m_health = health;};void setAttack(int attack) {m_attack = attack;};void setDefense(int defense) {m_defense = defense;};void setName(string name) {m_name = name;};void print() {cout << "name:" << m_name << ",health:" << m_health << endl;}
protected:int m_health;int m_attack;int m_defense;string m_name;
};class Player : public BaseCharacter {
public:Player(string name, int health, int attack, int defense) : BaseCharacter(name, health, attack, defense) {};~Player() {cout << "~Player " << m_name << endl;}shared_ptr<Prototype> clone() {return make_shared<Player>(*this);};
};class Enemy : public BaseCharacter {
public:Enemy(string name, int health, int attack, int defense) : BaseCharacter(name, health, attack, defense) {};~Enemy() {cout << "~Enemy " << m_name << endl;}shared_ptr<Prototype> clone() {return make_shared<Enemy>(*this);};
};
void test() {auto player1 = make_shared<Player>("Player1", 1, 2, 3);player1->setHealth(100);auto player2 = player1->clone();player2->setName("Player2");player1->setHealth(1000);player2->print();player1->print();
}
int main() {test();
}

http://www.ppmy.cn/server/156903.html

相关文章

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建

FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包&#xff0c;广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发&#xff0c;旨在为神经科学研究人员提供一个高效、精确的数据…

计算机网络 (29)网络地址转换NAT

前言 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是计算机网络中的一种重要协议&#xff0c;它主要用于将私有IP地址转换为公共IP地址&#xff0c;以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网&#xff08;LAN&…

并行云使用流程

1、背景知识 使用集群管理命令 module module 是一种环境管理工具&#xff0c;用于在共享计算&#xff08;如高性能计算集群或其他云环境&#xff09;中管理加载和依赖项的加载和卸载。它常用于集群环境&#xff0c;尤其是在没有 conda 或 docker 的情况下&#xff0c;通过自…

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极&#xff0c;LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理&#xff0c;当阳极为高电平&#xff0c;阴极为低电平则点亮&#xff0c;否则熄灭。 因此通过单片机P0口可控制点阵列&#xff0c;74HC595可控制点阵行 11 脚 SR…

《空舞的巨兽》官方学习版

一个以被遗忘之地为背景的原创故事&#xff0c;这是一个充满悲剧的没落王国。扮演外地战士雷恩猎人&#xff08;玩家&#xff09;&#xff0c;踏上危险的任务&#xff0c;结束困扰你自己和村庄的诅咒。你唯一的希望就是杀死不可杀死的可怕巨兽。 《空舞的巨兽》官方版 https:/…

实现3D在线预览的关键技术有哪些?有何应用场景?

3D在线预览是一种先进的技术应用&#xff0c;它允许用户在网页或移动设备上直接查看和操作3D模型&#xff0c;无需下载额外的软件。以下是关于3D在线预览的详细介绍&#xff1a; 一、3D在线预览的定义 3D在线预览是指通过互联网技术&#xff0c;在网页或移动应用上实时渲染和…

分享3个国内使用正版GPT的网站【亲测有效!2025最新】

1. molica 传送入口&#xff1a;https://ai-to.cn/url/?umolica 2. 多帮AI 传送入口&#xff1a;https://aigc.openaicloud.cn?inVitecodeMYAAGGKXVK 3. 厉害猫 传送入口&#xff1a;https://ai-to.cn/url/?ulihaimao

Linux 操作大全

Linux 是一个功能强大且灵活的操作系统&#xff0c;它不仅在服务器领域占据主导地位&#xff0c;在桌面环境、嵌入式系统和超级计算领域也有广泛的应用。为了更好地理解和高效使用 Linux&#xff0c;我们需要从多个角度深入挖掘其底层原理和高级功能。本文将深入探讨 Linux 系统…