设计模式- 原型模式(Prototype Pattern)结构|原理|优缺点|场景|示例

                            ​​​​​​​        设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式        责任链模式        命令模式

                                   备忘录模式          状态模式          访问者模式        中介者模式    


原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有的对象(即原型)来创建新对象,而不是每次都通过new操作符来创建对象。这种模式适用于创建新对象的成本较大(如初始化耗时、占用资源较多)或者创建过程较复杂的场景,通过克隆原型对象可以快速、便捷地生成相似或相同状态的新对象。

模式结构

原型模式通常包含以下角色:

  1. 原型(Prototype):定义一个克隆自身的接口,通常包含一个clone()方法。
  2. 具体原型(Concrete Prototype):实现原型接口,提供克隆自身的具体实现。具体原型类需要能够复制自身的状态,并可能包含必要的辅助方法来支持复制过程。

工作原理

  • 客户端:通过调用具体原型对象的clone()方法来创建新对象,无需关心对象的内部构造细节。
  • 具体原型:实现clone()方法,负责复制自身的状态,并可能需要处理深层次对象的递归复制。新创建的对象与原对象状态相同,但具有独立的标识(即不同的内存地址)。

优缺点

优点
  • 简化对象创建过程:对于复杂的对象,使用原型模式可以简化对象的创建过程,避免重复初始化或执行耗时的操作。
  • 提高性能:通过复制现有对象创建新对象,特别是在对象初始化成本较高的情况下,可以显著提高性能。
  • 支持动态增加或修改产品类:如果产品类需要动态添加或修改,使用原型模式可以避免对客户端代码产生影响。
缺点
  • 对象必须支持克隆:不是所有的对象都能很容易地实现克隆,尤其是包含复杂状态或引用其他对象时,克隆实现可能变得复杂。
  • 深拷贝与浅拷贝问题:在复制包含其他对象引用的状态时,需要考虑是否需要深度复制这些引用对象,否则可能导致数据不一致或意外共享状态。

适用场景

  • 对象创建成本较高:当创建新对象需要消耗大量资源、执行复杂操作或初始化时间较长时,使用原型模式可以有效提高效率。
  • 需要动态创建相似或相同状态的对象:如游戏中的角色复制、文档模板应用、数据恢复场景等,通过克隆原型对象快速生成新对象。
  • 需要避免对象之间的相互依赖:通过复制已有对象来创建新对象,可以减少对象间的依赖关系,降低系统的耦合度。

代码示例(以Java为例)

在Java中实现原型模式,可以利用Java内建的Cloneable接口和Object类提供的clone()方法。下面是一个简单的Java代码示例:

// 原型接口(由于Java中没有显式的原型接口,此处省略)

// 具体原型类实现Cloneable接口以支持克隆
public class ConcretePrototype implements Cloneable {
    private String attr1;
    private String attr2;

    public ConcretePrototype(String attr1, String attr2) {
        this.attr1 = attr1;
        this.attr2 = attr2;
    }

    // 提供公共的clone方法
    @Override
    public ConcretePrototype clone() throws CloneNotSupportedException {
        return (ConcretePrototype) super.clone();
    }

    // 其他方法、属性...

    public String getAttr1() {
        return attr1;
    }

    public String getAttr2() {
        return attr2;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        try {
            ConcretePrototype prototype = new ConcretePrototype("value1", "value2");
            ConcretePrototype clonedObject = prototype.clone();

            System.out.println(clonedObject.getAttr1());  // 输出:value1
            System.out.println(clonedObject.getAttr2());  // 输出:value2
        } catch (CloneNotSupportedException e) {
            // 不应该发生,因为ConcretePrototype实现了Cloneable接口
            e.printStackTrace();
        }
    }
}

在这个Java示例中:

  • ConcretePrototype类实现了Cloneable接口,表明它可以被克隆。
  • 重写了Object类的clone()方法,并将其声明为public,以便客户端可以直接调用。注意,虽然Cloneable接口没有实际的方法定义,但它是一个标记接口,用于指示对象支持克隆操作。
  • clone()方法中,调用super.clone()来执行实际的克隆过程。这会创建一个浅拷贝,即原始对象和克隆对象共享不可变的基本类型和对象引用。如果类中包含复杂对象或可变集合,可能需要在clone()方法中进行深度拷贝,以确保新对象的独立性。
  • 客户端代码通过调用prototype.clone()来创建新对象,捕获可能出现的CloneNotSupportedException异常(尽管在正确实现Cloneable的情况下,此异常通常不会抛出)。

请注意,Java的clone()方法默认执行的是浅拷贝,如果对象内部包含可变的复杂对象或集合,需要在clone()方法中手动进行深拷贝,以确保新对象的状态完整独立。例如,如果ConcretePrototype类中有一个可变的列表成员变量,需要在clone()方法中对其进行单独复制:

private List<String> items;

// ...其他代码...

@Override
public ConcretePrototype clone() throws CloneNotSupportedException {
    ConcretePrototype clone = (ConcretePrototype) super.clone();
    clone.items = new ArrayList<>(this.items);  // 深拷贝列表
    return clone;
}

代码示例(以Python为例)

import copy

# 原型接口
class Prototype:
    def clone(self):
        raise NotImplementedError("Subclasses must implement this method")

# 具体原型
class ConcretePrototype(Prototype):
    def __init__(self, attr1, attr2):
        self.attr1 = attr1
        self.attr2 = attr2

    def clone(self):
        return copy.deepcopy(self)

# 客户端代码
def main():
    prototype = ConcretePrototype("value1", "value2")
    cloned_object = prototype.clone()
    print(cloned_object.attr1, cloned_object.attr2)  # 输出:value1 value2

if __name__ == "__main__":
    main()

在这个Python示例中:

  • Prototype类作为原型接口,定义了clone()方法,要求子类必须实现。
  • ConcretePrototype类继承自Prototype,实现了具体的clone()方法。这里使用copy.deepcopy()来实现深度克隆,确保新创建的对象与原对象状态相同且具有独立的标识。
  • 客户端代码通过调用ConcretePrototype对象的clone()方法来创建新对象,无需关心对象的内部构造细节。新创建的对象与原对象状态相同,但具有独立的标识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CRMEB pro版/多门店商城系统客服配置教程

客服功能配置介绍 功能提示&#xff1a; Pro v2.0系统采用swoole框架&#xff0c;客服不需要单独配置&#xff0c;按照正常安装流程配置好程序即可使用&#xff01; 如出现客服无法使用&#xff0c;请检查&#xff1a; 1.消息队列是否正常 2.重启swoole 一、功能介绍 CRMEB商城…

刷课必备!用Python实现网上自动做题

前言 开学少不了老师会布置一些 软件上面的作业&#xff0c;今天教大家用python制作自动答题脚本&#xff0c;100%准确率哦喜欢的同学记得关注、收藏哦 环境使用 Python3.8Pycharm 模块使用 import requests —> 数据请求模块 pip install requestsimport parsel —>…

GPU 之争:训练大模型的显卡规格大比拼

训练大模型有多烧钱&#xff1f;&#xff08;含常用GPU规格比较&#xff09; 训练大模型有多烧钱&#xff1f; 解锁大型语言模型的运行秘诀大型语言模型 (LLM) 对硬件要求很高&#xff0c;其中显卡内存至关重要。Meta 的 LLaMA 2 模型提供了规模不等的选项&#xff1a;* 70B 模…

C++/Qt 小知识记录5

工作中遇到的一些小问题&#xff0c;总结的小知识记录&#xff1a;C/Qt 小知识5 Windows下查看端口占用情况C调用Python三方库测试库有没有被加上的测试方法初始化使用Python的env环境&#xff0c;用Py_SetPythonHome设置GDAL相关的&#xff0c;需要把osgeo、rasterio的路径加入…

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

yolov8 区域声光报警+计数

yolov8 区域报警计数 1. 基础2. 报警功能2. 1声音报警代码2. 2画面显示报警代码 3. 完整代码4. 源码 1. 基础 本项目是在 yolov8 区域多类别计数 的基础上实现的&#xff0c;具体区域计数原理可见上边文章 2. 报警功能 设置一个区域region_points&#xff0c;当行人这一类别…

SpringBoot整合Swagger2

SpringBoot整合Swagger2 1.什么是Swagger2&#xff1f;&#xff08;应用场景&#xff09;2.项目中如何使用2.1 导入依赖2.2 编写配置类2.3 注解使用2.3.1 controller注解&#xff1a;2.3.2 方法注解2.3.3 实体类注解2.3.4 方法返回值注解2.3.5 忽略的方法 3.UI界面 1.什么是Swa…

FPGA组合逻辑电路设计之译码器

在数字电路中可以根据电路功能的不同分为&#xff0c;组合逻辑电路与时序逻辑电路。组合逻辑 电路在逻辑功能上的特点是任意时刻的输出仅仅取决于该时刻的输入&#xff0c;与电路原来的状态无 关。而时序逻辑从电路特征上看来&#xff0c;其特点为任意时刻的输出不仅取决于该…

全网人气排行第一的免费开源ERP:Odoo电商功能应用亮点介绍

Odoo E-Commerce是一款创新型电子商务管理系统&#xff0c;旨在帮助企业建立以客户为中心的B2B与B2C电子商务平台&#xff0c;提高电商业务敏捷性&#xff0c;保障利润&#xff0c;并确保客户体验战略与时俱进。 —— 开源智造Odoo老杨 什么是Odoo免费开源电商管理系统&#xf…

Vue3引入高德地图js API 2.0

文章目录 前言一、地图加载1.本文准备环境2.引入库3.加载地图4.加载地图控件 二、POI搜索1.什么是poi搜索2.如何使用 三、绘制点标记与信息窗体1.场景描述2.案例3.信息窗体-链接路由跳转4.进阶-通过Marker自动触发标记点&#xff08;非鼠标手动点击&#xff09; 四、jsApi地图事…

文献速递:深度学习胶质瘤诊断---空间细胞结构预测胶质母细胞瘤的预后

Title 题目 Spatial cellular architecture predicts prognosis in glioblastoma 空间细胞结构预测胶质母细胞瘤的预后 01文献速递介绍 胶质母细胞瘤的治疗耐药性的关键驱动因素是肿瘤内的异质性和细胞状态的可塑性。在这里&#xff0c;我们调查了空间细胞组织与胶质母细胞瘤…

聚道云一键打通金蝶宁波银行,财务效率暴涨10倍!

客户介绍&#xff1a; 某农资有限公司是一家集农资贸易、仓储物流、农机服务为一体的大型企业。随着业务规模的不断扩大&#xff0c;传统的手动财务操作模式已难以满足其需求。公司急需寻找一种方法&#xff0c;将金蝶财务软件与宁波银行对接&#xff0c;实现资金流转自动化和…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

Ozone V3.32a Jlink显示变量波形

目录 前言 Ozone 配合Jlink显示变量波形 导出数组查看高频变量波形 总结 前言 Ozone V3.32a使用总结-CSDN博客 前面介绍了Ozone的安装和使用&#xff0c;因为调试需要&#xff0c;要看一些数据的波形。这里总结两种用Ozone查看变量波形的方法。 Ozone 配合Jlink显示变量波…

CCF-A类!狂涨6.131分,中科院2区,无版面费的王者刊物!

计算机领域 顶级好刊解析 今天解析的是一本Springer期刊&#xff0c;2022JCR发布后影响因子由13.369涨至19.5&#xff0c;年底升区可能性很大&#xff0c;究竟期刊实力如何呢&#xff1f;详情请看下文&#xff1a; 01 期刊简介 International Journal of Computer Vision ✅…

JSON Web Token 入门

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案&#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题 互联网服务离不开用户认证。一般流程是下面这样。 1、用户向服务器发送用户名和密码。 2、服务器验证通过后&#xff0c;在当前对话&…

Linux安装部署Tomcat

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Linux安装部署Tomcat //将tomcat压缩包解压到对…

Ts支持哪些类型和类型运算(下)

目录 1、条件判断 &#xff08;extends &#xff1f;&#xff09; 2、推导 infer 3、联合 | 4、交叉 & 5、映射类型 1、条件判断 &#xff08;extends &#xff1f;&#xff09; ts里的条件判断&#xff0c;语法为 T extends XXX ? true : false &#xff0c;叫做…

比特币中的符文是什么?

比特币中的符文是什么&#xff1f; 比特币符文是存在于比特币区块链上的独特的、可替代的代币。它们旨在代表具有独特特征和元数据的可替代资产。 Ordinals 协议的创建者 Casey Rodamor 最近放弃了一项替代 BRC-20 可替代代币协议的提案&#xff0c;该替代方案被称为 Runes。 破…
最新文章