创建型模式-原型模式

ops/2025/1/13 7:49:02/

原型模式是一种创建型模式,用于对已有的类进行克隆复制的操作。

适用场景:

1、当需要复制一些对象,同时又希望代码能独立于对象所属的具体类,可以使用原型模式

2、如果子类的区别仅在于其对象的初始化方式,那么可以使用该模式来减少子类的数量。

创建方式:

1、在需要复制的类中,增加clone的方法。如果有层次结构,每个子类中进行添加。

2、原型类必须另行定义一个以该类对象为参数的构造函数。构造函数必须复制参数对象中所有的成员变量值到新建实体中。

3、克隆方法通常只有一行代码,使用new运算符调用原型版本的构造函数。

这里不知道各位有啥疑问没有,我在这里一直有个疑问为啥不直接使用构造函数,经过查阅资料,现做出一下解释:

拷贝构造函数:他是类自己的一个方法,不能进行虚函数实现,因此只能创建本类对象。

clone函数:clone函数是一个成员函数,可以进行虚函数实现,这就给clone函数有了多态的能力,是他可以通过基类指针复制子类对象。

代码:

int main()
{std::cout << "欢迎东哥来到设计模式的世界!\n";ProductModel* productModel = new ProductModel();productModel->name = "基础实体";ProductModel* productModelClone = productModel->clone();cout << "生成的实体" << " : " << productModelClone->name << endl;ProductModel* carPproductModel = new CarProductModel();carPproductModel->name = "Car实体";ProductModel* carProductModelClone = carPproductModel->clone();cout << "生成的实体" << " : " << carProductModelClone->name << endl;ProductModel* phonePproductModel = new PhoneProductModel();phonePproductModel->name = "Phone实体";ProductModel* phoneProductModelClone = phonePproductModel->clone();cout << "生成的实体" << " : " << phoneProductModelClone->name << endl;
}
#pragma once
#include <string>
#include <iostream>
using namespace std;
class ProductModel//父类
{
public:ProductModel();ProductModel(ProductModel* productModel);~ProductModel();string name;virtual ProductModel* clone();
};class CarProductModel : public ProductModel
{
public:CarProductModel();CarProductModel(CarProductModel* productModel);~CarProductModel();string anme;CarProductModel* clone() override;
};class PhoneProductModel : public ProductModel
{
public:PhoneProductModel();PhoneProductModel(PhoneProductModel* productModel);~PhoneProductModel();string anme;PhoneProductModel* clone() override;
};
#include "YuanXinMoShi.h"ProductModel::ProductModel()
{
}ProductModel::ProductModel(ProductModel* productModel)
{cout << "调用的clone类 : ProductModel" << endl;this->name = productModel->name;
}ProductModel::~ProductModel()
{
}ProductModel* ProductModel::clone()
{return new ProductModel(this);
}CarProductModel::CarProductModel()
{
}CarProductModel::CarProductModel(CarProductModel* productModel)
{this->name = productModel->name;
}CarProductModel::~CarProductModel()
{
}CarProductModel* CarProductModel::clone()
{cout << "调用的clone类 : CarProductModel" << endl;return new CarProductModel(this);
}PhoneProductModel::PhoneProductModel()
{
}PhoneProductModel::PhoneProductModel(PhoneProductModel* productModel)
{this->name = productModel->name;
}PhoneProductModel::~PhoneProductModel()
{
}PhoneProductModel* PhoneProductModel::clone()
{cout << "调用的clone类 : PhoneProductModel" << endl;return new PhoneProductModel(this);
}

http://www.ppmy.cn/ops/149668.html

相关文章

Docker自定义网络,让容器之间相互通信

目录 1、前置条件 1.1. 环境 1.2. 工具 2. 为什么需要自定义网络 2.1 安全性 2.2 隔离性 2.3 简化容器间通信 3. 执行命令 3.1. 设置自定义网络 3.2. 启动容器时绑定自定义网络 3.3. 查看nginx2容器信息容器信息 3.4. 进入nginx1容器 3.5. 尝试与nginx2容器互通 4…

详细解释 Vue 中的 h 函数和 render 函数:

Vue中的h函数和render函数是Vue中非常重要的函数&#xff0c;对Vue有着不可以或缺的作用&#xff0c;接下来让我们了解一下&#xff01; // 1. h 函数的基本使用 /*** h 函数是 createVNode 的别名&#xff0c;用于创建虚拟 DOM 节点&#xff08;VNode&#xff09;* h 函数参数…

扬帆数据结构算法之舟,启航C++探索征途——LeetCode深度磨砺:顺序表技术精进实践

人无完人&#xff0c;持之以恒&#xff0c;方能见真我&#xff01;&#xff01;&#xff01; 共同进步&#xff01;&#xff01; 文章目录 顺序表练习1.移除数组中指定的元素方法1&#xff08;顺序表&#xff09;方法2&#xff08;双指针&#xff09; 2.删除有序数组中的重复项…

掌握 Node.js 中的安全身份验证:使用 bcrypt.js 和 JWT 登录/注销

假设您正在构建一个即将发布的 Web 应用程序。您精心设计了用户界面&#xff0c;添加了令人兴奋的功能&#xff0c;并确保一切运行顺利。但随着发布日期的临近&#xff0c;一个令人烦恼的问题开始让您担心——安全性。具体来说&#xff0c;如何确保只有正确的用户才能访问应用程…

【Ubuntu与Linux操作系统:三、用户与组管理】

第3章 用户与组管理 3.1 用户与组概述 Linux是一个多用户操作系统&#xff0c;允许多个用户同时登录并执行任务。每个用户在系统中都有独立的身份和权限。为了更高效地管理用户&#xff0c;Linux通过“组”的概念将用户进行分类。 用户&#xff08;User&#xff09;&#xff…

Python贪心

贪心 贪心&#xff1a;把整体问题分解成多个步骤&#xff0c;在每个步骤都选取当前步骤的最优方案&#xff0c;直至所有步骤结束&#xff1b;每个步骤不会影响后续步骤核心性质&#xff1a;每次采用局部最优&#xff0c;最终结果就是全局最优如果题目满足上述核心性质&#xf…

【源码解析】Java NIO 包中的 Buffer

文章目录 1. 前言2. 概述3. 属性4. 方法4.1 构造器4.2 flip()4.3 clear()4.4 rewind()4.5 reset 和 mark4.6 remaining 和 hasRemaining4.7 其他的工具方法4.7.1 isReadOnly - 抽象方法4.7.2 hasArray - 抽象方法4.7.3 array - 抽象方法4.7.4 arrayOffset - 抽象方法4.7.5 isDi…

数据结构与算法之链表: LeetCode 92. 反转链表 II (Ts版)

反转链表 II https://leetcode.cn/problems/reverse-linked-list-ii/description/ 描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 示例 1 输入&…