设计模式-13 - Prototype Design Pattern 原型设计模式

设计模式-13 - Prototype Design Pattern  原型设计模式


1.定义


原型设计模式是一种创建对象的方式,它通过复制一个现有的对象(原型)来创建一个新对象。


2.内涵

优点:

  • 创建对象的高效方式:克隆一个对象比从头开始创建新对象要快得多。
  • 降低系统的复杂性:通过消除创建新对象所需的复杂逻辑,原型设计模式简化了代码。
  • 确保一致性:所有从原型创建的对象都具有相同的属性和行为,从而确保了一致性。

结构:

原型设计模式涉及以下主要参与者:

  • 原型(Prototype):定义要克隆的对象的接口。
  • 具体原型(ConcretePrototype):实现 Prototype 接口的具体类,表示要克隆的实际对象。
  • 客户端(Client):使用 Prototype 接口创建新对象。


假设我们有一个形状绘制应用程序,它需要创建不同形状的对象。我们可以使用原型设计模式来克隆现有形状,而不是每次都需要时都从头创建形状。


3.使用示例
class Shape {
public:virtual Shape* clone() const = 0; // Clone method for creating copies.virtual void draw() const = 0; // Draw method for rendering the shape.virtual ~Shape() {}             // Virtual destructor for proper cleanup.
};class Circle : public Shape {
private:double radius;public:Circle(double r) : radius(r) {}Shape* clone() const override {return new Circle(*this);}void draw() const override {std::cout << "Drawing a circle with radius " << radius << std::endl;}
};class Rectangle : public Shape {
private:double width;double height;public:Rectangle(double w, double h) : width(w), height(h) {}Shape* clone() const override {return new Rectangle(*this);}void draw() const override {std::cout << "Drawing a rectangle with width " << width << " and height " << height << std::endl;}
};main.cppCircle circlePrototype(5.0);
Rectangle rectanglePrototype(4.0, 6.0);Shape* shape1 = circlePrototype.clone();
Shape* shape2 = rectanglePrototype.clone();shape1->draw(); // Output: Drawing a circle with radius 5
shape2->draw(); // Output: Drawing a rectangle with width 4 and height 6

4.注意事项


在使用原型设计模式时需要注意以下事项:

  • 对象的复杂性:原型设计模式最适合用于创建轻量级对象。如果对象很复杂,克隆它们的成本可能很高。
  • 对象的引用:如果原型对象包含对其他对象的引用,则克隆对象时也需要克隆这些引用。这可能会导致创建对象图的开销很高。
  • 不可变对象:如果原型对象是不可变的,则无法对其属性进行修改。在这种情况下,使用原型设计模式没有任何好处,因为创建的新对象将与原型完全相同。
  • 多线程环境:在多线程环境中使用原型设计模式时,需要确保对原型对象的访问是线程安全的。否则,可能会导致数据损坏或其他问题。
  • 性能考虑:克隆对象需要额外的处理时间和内存。在性能关键的应用程序中,需要权衡创建新对象与克隆现有对象之间的成本。

5.最佳实践


原型设计模式的最佳实践:

  • 将原型对象存储在中央位置:这将使客户端可以轻松地访问原型,并有助于确保所有克隆对象都使用相同的原型。您可以使用单例模式来实现这一点。
  • 使用工厂方法创建原型:这将允许您在需要时延迟创建原型。您可以使用一个工厂类来管理原型对象的创建。
  • 只克隆必要的属性:如果原型对象包含大量数据,则应只克隆真正需要的数据。这将有助于减少内存开销和提高性能。您可以使用浅拷贝或深拷贝来实现这一点,具体取决于您的需求。
  • 考虑多线程环境:在多线程环境中使用原型设计模式时,需要确保对原型对象的访问是线程安全的。您可以使用互斥锁或其他同步机制来实现这一点。
  • 测试您的克隆:确保您的克隆对象与原型对象具有相同的状态和行为。您可以使用单元测试或其他测试技术来实现这一点。
6.总结


仅在需要创建大量相同对象时才使用原型设计模式,考虑使用对象池来管理克隆对象的创建和销毁,使用原型设计模式来创建不可变对象,以避免意外修改。


探索其他设计模式,例如工厂方法模式或单例模式,以了解它们如何与原型设计模式一起使用。通过遵循这些最佳实践,您可以有效且高效地使用原型设计模式来创建对象并提高应用程序的性能。
 

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

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

相关文章

【数据结构陈越版笔记】第1章 概论

我最近准备以陈姥姥的数据结构教材为蓝本重新学一下数据结构&#xff0c;写一下读书笔记 第1章 概论 1.1 引子 概论中首先描述了&#xff0c;数据结构的定义没有具体的定义&#xff0c;初学者可以不用管这个定义的问题&#xff0c;但是我理解的和维基百科的说法是一样的“数…

全面了解 Swagger 导出功能的使用方式

Swagger 是一个强大的平台&#xff0c;专门用于开发、构建和记录 RESTful Web 接口。通过其提供的交互式用户界面&#xff0c;开发人员能够轻松且迅速地创建和测试 API。Swagger 还允许用户以多种格式&#xff0c;包括 JSON 和 Markdown&#xff0c;导出 API 文档。选择 JSON 格…

人工神经网络(科普)

人工神经网络&#xff08;Artificial Neural Network&#xff0c;即ANN &#xff09;&#xff0c;是20世纪80 年代以来人工智能领域兴起的研究热点。它从信息处理角度对人脑神经元网络进行抽象&#xff0c; 建立某种简单模型&#xff0c;按不同的连接方式组成不同的网络。在工程…

Android - 3段式耳机和4段式耳机

在看调整音频参数的相关文档时发现&#xff0c;audio模式下音频参数上还会对耳机有区分。  Headset4P&#xff1a; 4 段式耳机&#xff08; 8k LTENB &#xff09;  Headset3P&#xff1a; 3 段式耳机&#xff08; 8k LTENB &#xff09; 但不太清楚相关设计&#xff0…

MySQL中的索引失效问题

索引失效的情况 这是正常查询情况&#xff0c;满足最左前缀&#xff0c;先查有先度高的索引。 1. 注意这里最后一种情况&#xff0c;这里和上面只查询 name 小米科技 的命中情况一样。说明索引部分丢失&#xff01; 2. 这里第二条sql中的&#xff0c;status > 1 就是范围查…

error和exception的区别?

Error类: 一般是指与虚拟机相关的问题&#xff0c;如:系统崩溃,虚拟机错误&#xff0c;内存空间不足&#xff0c;方法调用栈溢出等。这类错误将会导致应用程序中断&#xff0c;仅靠程序本身无法恢复和预防; Exception 类:分为运行时异常和受检查的异常。 运行时异常:【如空指针…

什么品牌洗地机最好?怎么选?2024家用洗地机推荐攻略

随着科技的不断发展&#xff0c;家用洗地机已经成为人们家庭清洁任务重非常重要的辅助工具。家用洗地机集吸尘、扫地、拖地等功能于一体&#xff0c;通过高速旋转的滚刷和强力的吸力&#xff0c;将地面上的污渍、细菌和毛发等吸入污水箱&#xff0c;从而达到清洁地面的目的。但…

Uboot(三)

Uboot的移植 移植 U-Boot 到新的硬件平台通常涉及以下几个步骤&#xff1a; 了解目标硬件平台&#xff1a;首先&#xff0c;你需要详细了解目标硬件平台的架构、处理器类型、外设配置、存储器布局等信息。这包括查阅硬件手册、芯片手册、电路图以及原始的引导代码等。 获取 U…

Java设计模式-命令模式(16)

命令设计模式(Command Pattern)在Java中的实现细节如下所述,这将是一个详细的教程,涵盖模式的基本概念、组成部分、实现步骤、以及如何在实际开发中应用这一模式。 命令设计模式基础 命令模式是一种行为设计模式,它将请求封装成对象,允许你参数化客户对请求的调用,队列…

CentOS 磁盘挂载

查看磁盘挂载情况 df -hFilesystem Size Used Avail Use% Mounted on devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 17M 3.9G 1% /run tmpfs 3.9G 0 3.9G 0% /sys/fs/cgrou…

java static 关键字

在Java中&#xff0c;static是一个关键字&#xff0c;用于创建类级别的成员&#xff08;字段、方法、块&#xff09;。static成员属于类本身&#xff0c;而不是类的实例&#xff0c;因此可以直接通过类名访问&#xff0c;而不需要创建类的实例。 1. 静态字段&#xff08;Stati…

mysql查询某个字段重复数据

要查询MySQL中某个字段的重复数据&#xff0c;可以使用GROUP BY和HAVING子句。以下是一个示例SQL查询&#xff0c;它将找出table_name表中column_name字段的所有重复值及其出现的次数。 SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name HAVING COUNT(*) &…

软件验收测试包括哪些类型

在软件开发过程中&#xff0c;验收测试是一个至关重要的环节&#xff0c;它确保了软件的质量、功能性和用户体验符合预期。验收测试主要关注于软件是否满足用户需求和业务目标&#xff0c;从而确保软件能够顺利交付并投入使用。本文将介绍软件验收测试的主要类型及其关键要素。…

扩展van Emde Boas树以支持卫星数据:设计与实现

扩展van Emde Boas树以支持卫星数据&#xff1a;设计与实现 1. 引言2. vEB树的基本概念3. 支持卫星数据的vEB树设计3.1 数据结构的扩展3.2 操作的修改3.3 卫星数据的存储和检索 4. 详细设计和实现4.1 定义卫星数据结构体4.2 修改vEB树节点结构4.3 插入操作的伪代码4.4 C语言实现…

最小化测试步骤

打镜像并导入公有云 开机 注意hosts文件格式,需要重新改正 3、出包测试 前置,开启yum缓存功能 vim /etc/yum.conf keepcache=1 installonlypkgs=* 正常部署 必要包yum -y install tar \ gzip \ telnet \ wget \ vim \ traceroute \ curl \ tcpdump \ createrepo \ sysst…

声纹识别的对抗与防御

随着机器学习理论和方法的发展, 出现了用于模仿特定说话人语音的深度伪造、针对语音识别和声纹识别的对抗样本, 它们都为破坏语音载体的可信性和安全性提供了具体手段, 进而对各自应用场景的信息安全构成了挑战。 深度伪造是利用生成式对抗网络等方法, 通过构建特定的模型, 产生…

【爬虫之scrapy框架——尚硅谷(学习笔记one)--基本步骤和原理+爬取当当网(基本步骤)】

爬虫之scrapy框架——基本原理和步骤爬取当当网&#xff08;基本步骤&#xff09; 下载scrapy框架创建项目&#xff08;项目文件夹不能使用数字开头&#xff0c;不能包含汉字&#xff09;创建爬虫文件&#xff08;1&#xff09;第一步&#xff1a;先进入到spiders文件中&#x…

Python多任务

进程 1. 进程的概念 一个正在运行的程序或者软件就是一个进程&#xff0c;它是操作系统进行资源分配的基本单位&#xff0c;也就是说每启动一个进程&#xff0c;操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。 比如:现实生活中的公司可以理解成是一个进程&a…

机器学习回归模型代码理解——三阶多项式拟合`y = sin(x)`

机器学习回归模型代码理解——三阶多项式拟合y sin(x) 先上代码&#xff1a; # -*- coding: utf-8 -*- import numpy as np import math# 创建随机输入值和输出数据 x np.linspace(-math.pi, math.pi, 2000) y np.sin(x)# 随机初始化权重 a np.random.randn() b np.rand…

什么是枚举?列举几个枚举的使用场景

枚举&#xff08;Enumeration&#xff09; 是一种特殊的数据类型&#xff0c;它允许你为一组相关的值定义名称。在编程中&#xff0c;枚举类型通常用于表示固定数量的常量值。这些值在枚举类型中是唯一的&#xff0c;并且它们的名称在类型上是关联的。 枚举的使用场景多种多样…