原型模式(Prototype)

原型模式是一种创建型设计模式,使调用方能够复制已有对象,而又无需使代码依赖它们所属的类。当有一个类的实例(原型),并且想通过复制原型来创建新对象时,通常会使用原型模式。

The Prototype pattern is generally used when we have an instance of the class (prototype) and we'd like to 
create new objects by just copying the prototype.

结构设计

原型模式包含如下角色:
Prototype,原型类,用来声明克隆方法。在绝大多数情况下,只会有一个名为 clone 的方法。
ConcretePrototype,具体原型类,用来实现克隆方法。除了将原始对象的数据复制到克隆体中之外,该方法有时还需处理克隆过程中的极端情况, 例如克隆关联对象梳理递归依赖等等。
原型模式类图表示如下:
请添加图片描述

伪代码实现

接下来将使用代码介绍下原型模式的实现。

// 1.定义原型接口,用来声明克隆方法
public interface Prototype {
    /**
     * 复制对象
     *
     * @return 复制后的对象
     */
    Prototype clone();
}
// 2、定义具体原型类(ConcretePrototype),用来实现克隆方法
public class ConcretePrototype implements Prototype {
    private String field;
    public ConcretePrototype() {
    }
    public String getField() {
        return field;
    }
    public ConcretePrototype(String field) {
        this.field = field;
    }
    @Override
    public Prototype clone() {
        ConcretePrototype concretePrototype = new ConcretePrototype();
        concretePrototype.field = this.field;
        return concretePrototype;
    }
}
// 3、客户端调用
public class PrototypeClient {
    public PrototypeClient() {

    }

    // 调用方式:调用具体原型实例的克隆方法
    public void test() {
        Prototype concretePrototype = new ConcretePrototype("foo");
        ConcretePrototype clonedPrototype = (ConcretePrototype) concretePrototype.clone();
        System.out.println(clonedPrototype.getField());
    }
}

需要说明的是,对于Java语言来说,Object基类已经提供了一个clone的保护方法,用于实现对象的浅复制。注意,只有实现了Cloneable接口才可以调用该方法,
否则抛出CloneNotSupportedException异常。更多clone方法的介绍,可以参考笔者之前的文章。

适用场景

在以下情况下可以考虑使用原型模式:
(1) 如果需要复制一些对象,同时又希望代码独立于这些对象所属的具体类,可以使用原型模式。
例如,代码里需要处理第三方接口传递过来的对象时,即使不考虑代码耦合的情况, 调用方的代码也不能依赖这些对象所属的具体类,因为无法知道它们的具体信息。
原型模式,可以为调用方提供一个通用接口,调用方可通过这一接口与所有实现了克隆的对象进行交互,它也使得调用方与其所克隆的对象具体类独立开来。
(2) 如果子类的区别仅在于其对象的初始化方式,那么可以使用原型模式来减少子类的数量。
在原型模式中, 可以使用一系列预生成的、各种类型的对象作为原型(原型对象池)。客户端不必根据需求对子类进行实例化,只需找到合适的原型并对其进行克隆即可。

优缺点

原型模式有以下优点:
(1) 将对象克隆与对象所属的具体类分离(解耦),避免克隆对象与具体类的紧耦合。
(2) 简化了复杂对象的初始化代码。对一些复杂对象,可以通过提供克隆方法来简化调用方的使用。
(3) 提供了除继承以外的方式来实现复杂对象的初始化。继承建立了子类与父类的强耦合,如果可以,尽量不要使用继承。
但是原型模式也存在以下缺点:
(1) 在重写克隆方法时,对于复杂对象的关联对象或递归依赖等处理相比麻烦一些。

参考

《设计模式:可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著 李英军, 马晓星 等译
https://www.cnblogs.com/adamjwh/p/9033550.html 简说设计模式——原型模式
https://refactoringguru.cn/design-patterns/prototype 原型模式
https://www.baeldung.com/java-pattern-prototype Prototype Pattern in Java

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

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

相关文章

解决Pycharm下opencv代码提示问题

解决Pycharm下opencv代码提示问题 新安装了opencv-python4.7.0.72版本,在pycharm中导入cv2后没有代码提示,解决方法如下: 解决方案 我使用的是miniconda环境,opencv安装的路径为:C:\Env\miniconda3\envs\compute\Li…

Vue3和TypeScript项目-移动端兼容

1 全局安装typescript 2 检测安装成功 3 写的是ts代码,但是最后一定要变成js代码,才能在浏览器使用 这样就会多一个js文件 3 ts语法 数组语法 对象语法 安装vue3项目 成功后进入app。安装依赖。因为我们用的是脚手架,要引入东西的时候不需要…

python的下载和安装步骤,python下载安装教程3.10.0

大家好,给大家分享一下python下载安装教程3.10.0,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 第一步:下载Python安装包 在Python的官网 www.python.org 中找到最新版本的Python安装包,点击进行下载&a…

【Java】UWB高精度工业人员安全定位系统源码

基于VueSpring boot前后端分离架构开发的一套UWB技术高精度定位系统源码。 UWB高精度人员定位系统提供实时定位、电子围栏、轨迹回放等基础功能以及各种拓展功能,用户可根据实际需要任意选择搭配拓展功能。该系统简易部署,方便使用,实时响应。UWB高精度定…

【小沐学前端】GitBook制作在线电子书、技术文档(gitbook + Markdown + node)

文章目录 1、简介1.1 工具简介1.2 使用费用 2、安装2.1 安装node2.2 安装gitbook 3、测试3.1 编辑文档3.2 编译工程3.3 预览工程 结语 1、简介 官网地址: https://www.gitbook.com/1.1 工具简介 什么是 GitBook? GitBook 是一个现代文档平台&#xff…

黑客技术(网络安全)自学

一、黑客是什么 原是指热心于计算机技术,水平高超的电脑专家,尤其是程序设计人员。但后来,黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实,网络信息空间安全已经成为海陆空之…

Stable Diffusion教程(6) - 图片高清放大

放大后细节 修复图片损坏 显存占用 速度 批量放大 文生图放大 好 是 高 慢 否 附加功能放大 一般 否 中 快 是 图生图放大 好 是 低 慢 是 tile模型放大 非常好 是 高 快 是 通过文生图页面的高清修复 优点:放大时能添加更多细节&am…

DAY3,C高级(shell中的变量、数组、算术运算、分支结构)

1.今日思维导图; 2.判断家目录下,普通文件的个数和目录文件的个数; 1 #!/bin/bash2 arr1(ls -la ~/ | cut -d r -f 1 | grep -w -)3 arr2(ls -la ~/ | cut -d r -f 1 | grep -w d)4 echo "普通文件个数:${#arr1[*]}"5 e…

Qt Creator中designer使用QWebEngine异常排查

Qt Creator中designer使用QWebEngine异常排查 1、前提背景 最近由于版权的原因,我们采取了自编译的Qt Creator。编译完成之后启动Qt Creator刚开始一切都是很顺利。 但是在Creator中打开designer,使用QWebEngine控件就发生了异常,Qt Creat…

单通道 6GSPS 16位采样DAC子卡模块--【资料下载】

FMC147是一款单通道6.4GSPS(或者配置成2通道3.2GSPS)采样率的12位AD采集、单通道6GSPS(或配置成2通道3GSPS)采样率16位DA输出子卡模块,该板卡为FMC标准,符合VITA57.4规范,该模块可以作为一个理想…

python数据容器

目录 数据容器 反向索引 list列表 语法 案例 列表的特点 列表的下表索引 list的常用操作 list列表的遍历 while循环遍历 for循环遍历 tuple元组 前言 元组定义 元组特点 获取元组元素 元组的相关操作 元组的遍历 while循环遍历 for循环遍历 字符串 前言…

MySQL事务篇:ACID原则、事务隔离级别及事务机制原理剖析

引言 众所周知,MySQL数据库的核心功能就是存储数据,通常是整个业务系统中最重要的一层,可谓是整个系统的“大本营”,因此只要MySQL存在些许隐患问题,对于整个系统而言都是致命的。那此刻不妨思考一个问题: …

HTML5+CSS3小实例:带标题的3D多米诺人物卡片

实例:带标题的3D多米诺人物卡片 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content…

Unity 引擎做残影效果——2、屏幕后处理方式

Unity实现残影效果 大家好&#xff0c;我是阿赵。 这里继续介绍Unity里面做残影的方法。之前介绍了BakeMesh的方法做残影&#xff0c;这一期介绍的是用屏幕后处理的方法做残影。 一、原理 之前的BakeMesh方法&#xff0c;是真的生成了很多个网格模型在场景里面。如果用后处理做…

前端如何打开钉钉(如何唤起注册表中路径与软件路径不关联的软件)

在前端唤起本地应用时&#xff0c;我查询了资料&#xff0c;在注册表中找到腾讯视频会议的注册表情况&#xff0c;如下&#xff1a; 在前端代码中加入 window.location.href"wemeet:"; 就可以直接唤起腾讯视频会议&#xff0c;但是我无法唤起钉钉 之所以会这样&…

使用手机相机检测电脑屏幕刷新率Hz

使用手机相机检测电脑屏幕刷新率Hz 1、电脑打开https://www.testufo.com/frameskipping 2、相机专业模式&#xff1a;快门1/10、ISO自动&#xff0c;拍摄一张照片。120Hz至少要有12个亮块&#xff0c;50Hz至少有6个亮块。 更改刷新速率 1、选择 “开始>设置>系统>显示…

Nodejs 第八章(npm搭建私服)

构建npm私服 构建私服有什么收益吗&#xff1f; 可以离线使用&#xff0c;你可以将npm私服部署到内网集群&#xff0c;这样离线也可以访问私有的包。提高包的安全性&#xff0c;使用私有的npm仓库可以更好的管理你的包&#xff0c;避免在使用公共的npm包的时候出现漏洞。提高…

性能测试/负载测试/压力测试之间的区别

做测试一年多来&#xff0c;虽然平时的工作都能很好的完成&#xff0c;但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺&#xff0c;所以&#xff0c;在工作之余也做了一些测试方面的知识的补充。不足之处&#xff0c;还请大家多多交流&#xff0c;互相学习。 …

网络安全(黑客)工具篇

大家好。这篇文章给大家盘点那些年&#xff0c;我们一起玩过的网络安全工具。 一、反恶意代码软件 1.Malwarebytes 这是一个检测和删除恶意的软件&#xff0c;包括蠕虫&#xff0c;木马&#xff0c;后门&#xff0c;流氓&#xff0c;拨号器&#xff0c;间谍软件等等。快如闪…

【JAVASE】多态

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 多态 1. 概念2. 实现条件3. 重写4. 向上…