JAVA SCRIPT设计模式--创建型设计模式之原型模式(4)

news2024/9/22 7:31:16

        JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了解设计模式目录、原则、设计变化方向,环境相关等信息请查看设计模式开篇。


一、UML类图

 

参与者:

1.1 Prototype(Graphic)

  • 声明一个克隆自身的接口。

1.2 ConcretePrototype(Staff、WholeNote、HalfNote)

  • 实现一个克隆自身的操作。

1.3 Client(GraphicTool)

  • 让一个原型克隆自身从而创建一个新的对象。

 

二、意图

       用原型实例指定创建对象,并且通过拷贝这些原型创建新的对象。从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

      Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.

三、适用性

        当一个系统应该独立于它的产品创建、构成和表示时,要使用 Prototype模式;

  1. 当要实例化的类是在运行时刻指定时,例如,通过动态装载;。
  2. 为了避免创建一个与产品类层次平行的工厂类层次时
  3. 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

四、优点和缺点

4.1 优点

  • 隐藏了对象创建的细节,大大提升了性能。不用重新初始化对象,而是动态的获得对象运行时的状态。

4.2 缺点

  • 深复制 or 浅复制 。

五、示例代码

5.1  动机

        比如你想构建一个拥有通用架构的音乐编辑器 ,该编辑器架构可以图形编辑,也可以增加一些表示音符、休止符和五线谱的新对象。这个编辑器框架可能有一个工具选择板用于将这些音乐对象加到乐谱中。这个选择板可能还包括选择、移动和其他操纵音乐对象的工具。用户可以点击四分音符并使用它将四分音符加到乐谱中。或者他们可以使用在五线谱上上下移动一个音符,从而改变它的音调。

         我们假定该框架为音符和五线谱这样的图形构件提供了一个抽象的Graphics类。此外,为定义选择板中的那些工具,还提供一个抽象类Tool。该框架还为一些创建图形对象实例并将它们加入到文档中的工具预定义了一个GraphicTool子类(The framework also predefines a GraphicTool subclass for tools that create instances of graphical objects and add them to the document.)。

        但GraphicTool给框架设计者带来一个问题。音符和五线谱的类特定于我们的应用,而GraphicTool类却属于框架。GraphicTool不知道如何创建我们的音乐类的实例,并将它们添加到乐谱中。我们可以为每一种音乐对象创建一个GraphicTool的子类,但这样会产生大量的子类,这些子类仅仅在它们所初始化的音乐对象的类别上有所不同。我们知道对象复合object composition是比创建子类更灵活的一种选择。问题是,该框架怎么样用它来参数化GraphicTool的实例,而这些实例是由Graphic类所支持创建的(The question is, how can the framework use it to parameterize instances of GraphicTool by the class of Graphic they're supposed to create? )。

        解决办法是让GraphicTool通过拷贝或者“克隆”一个Graphic子类的实例来创建新的Graphic,我们称这个实例为一个原型。GraphicTool将它应该克隆和添加到文档中的原型作为参数(GraphicTool is parameterized by the prototype it should clone and add to the document. )。如果所有Graphic子类都支持一个Clone操作,那么GraphicTool可以克隆所有种类的Graphic。

       

5.2  示例UML

目录结构:

5.3 Prototype(Graphic)

  • 声明一个克隆自身的接口。
export default  class Graphic {
	
    constructor() {
    }
    Draw(position) {  
		 console.log(` 非重点 `);
    }
    Clone() {   
		console.log(` 重点 `);
    }
  }

5.4 ConcretePrototype(Staff、WholeNote、HalfNote)

  • 实现一个克隆自身的操作。
import Graphic  from '../Graphic.js';

export default  class Staff extends Graphic {
    #oneAtti=0;
	#anotherAtti=0;
	constructor() {
		 super();
    }
    Clone() {  
		let newCopy=new  Staff(); //copy 的深度,
		newCopy.#oneAtti=this.#oneAtti;
		newCopy.#anotherAtti=2;
		return newCopy;
    }
    
  } 

5.5 Client(GraphicTool)

  • 让一个原型克隆自身从而创建一个新的对象。

5.6 Client 

import Staff  from './Graphic/impl/Staff.js';
import Graphic  from './Graphic/Graphic.js';
 
export default class Client{
    main(){
	    let staff =new Staff();//Graphic
		let copystaff=staff.Clone();
		console.log(` aaaaaaaa `);
    } 
 }

5.8 测试HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 
 
 <script  type="module" >
 import Client  from './Client.js'; 
 
let cl=new Client();
cl.main()

 </script>
</head>
<body>

    
</body>
</html>

测试结果:

六、源代码下载

        下载链接:https://pan.baidu.com/s/1XuPqp84cccBNVkbnMY3sKw 
         提取码:q2ut

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

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

相关文章

Sunday 算法详解

Sunday 算法 Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是&#xff1a;在匹配过程中&#xff0c;模式串发现不匹配时&#xff0c;算法能跳过尽可能多的字符以进行下一步的匹配&#xff0c;从而提高了匹配效率。 一、匹配机制 匹配机制非常容易理…

PyTorch笔记 - 开发技巧与爱因斯坦标示法(einops)

欢迎关注我的CSDN:https://blog.csdn.net/caroline_wendy 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128222398 NLP seq2seq代码编写技巧 数据 tokenization,离散符号,翻译,划分tokentoken2idx,将token变成idxadd SoS&EoS,开头和结尾添加标识…

代码随想录算法训练营第五十七天| LeetCode647. 回文子串、LeetCode516. 最长回文子序列

一、LeetCode647. 回文子串 1&#xff1a;题目描述&#xff08;647. 回文子串&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不…

Unity3d C#获取海康/大华摄像头在萤石平台直播视频流功能(含源码)

前言 实现该功能主要是因为之前硬件实施工程是给我的视频流地址总是失效&#xff0c;原因就是视频流地址其实都有一个过期时间&#xff08;类似于&#xff1a;rtmp://rtmp01open.ys7.com:/v3/openlive/_1_1?expire1669341172&id***&t8cb15956b1ca09770d1496bff3b8ccb…

电子书小程序源码

资源简介 价值8k的的电子书资料文库文集ip打造流量主小程序系统源码 个人即可搭建&#xff0c;附上此系统源码以及详细的‘’一小时的小白手把手教搭建教程‘’ 下面开始系统介绍&#xff1a; 无意中在群里刷到一个文集小程序 点击立即学习里面&#xff0c;是电子书。 点击了…

虹科分享|基于CAN/CAN FD技术的机器狗是什么样的?

机器狗是一种结合了仿生学和人工智能的仿生四足机器人&#xff0c;其外形与四足动物相似&#xff0c;由于其运动摆脱了轮式和履带式的设计&#xff0c;机器狗的机动性更为强大&#xff0c;能够灵活地完成多种复杂的运动&#xff0c;并能够在不同的地理环境中自主行走&#xff0…

oracle 定时任务删除数据

这几天在工作中遇到一个问题就是&#xff1a;要删除表在备份表中已存在的数据&#xff08;2000多万数据&#xff09;&#xff0c;这个数据是SQL查出来的&#xff0c;例如&#xff1a; select count(1) from JY_SALE_FULLORDER_DTL where LINE_NUM in (select b.LINE_NUMfrom JY…

osgEarth示例分析——osgearth_splat

前言 osgearth_splat示例&#xff0c;展示如何加载图片贴在地球上&#xff0c;且通过分类&#xff0c;贴文理绘制森林、草地等。 执行命令&#xff1a;osgearth_splatd.exe 效果 整个地球的影像&#xff0c;加载的一张贴图。黑白点点&#xff0c;是不同的贴图。当拉进放大后…

云计算与传统计算的区别有哪些?

目前&#xff0c;许多企业依赖传统计算&#xff0c;而一些企业也正在迁移到云计算。原因是两者都有各自的优势点&#xff0c;这就是为什么对企业来说&#xff0c;在两者之间进行选择可能会变得有点困难。 什么是传统计算? 传统计算的概念是不言而喻的。传统上&#xff0c;物理…

[附源码]Python计算机毕业设计Django兴达五金日杂批发商店管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

微服务框架 SpringCloud微服务架构 21 RestClient 操作文档 21.5 批量导入文档

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构21 RestClient 操作文档21.5 批量导入文档21.5.1 批量导入文档21 RestClie…

【Java面试】说一说JDK1.6之后对synchronized的优化

文章目录为什么synchronized性能低下&#xff1f;JDK1.6对synchronized的优化偏向锁(无锁状态)轻量级锁(自旋)重量级锁(阻塞)这些锁的优缺点早期JDK对synchronized的实现是重量级的&#xff0c;每一次的获取锁都需要请求OS。 而在大部分情况下&#xff0c;同步方法是运行在单线…

若依权限校验源码分析

若依的权限校验实现原理就是AOP自定义注解&#xff0c;代码并不多&#xff0c;debug跟一遍之后很容易理解&#xff0c;详细流程整理如下 用到的类 注解类RequiresLogin、RequiresPermissions、RequiresRoles&#xff0c;分别用于登录认证、权限认证和角色认证切面类PreAuthor…

极米H5评测:极米H5投影仪参数如何?极米H5值得入手吗?

作为家用智能投影领域的佼佼者&#xff0c;极米在上个月结束的双11活动中&#xff0c;实现了全网成交总额破8亿&#xff0c;并获得天猫、京东和抖音投影品类销量和GMV双第一的成绩&#xff0c;同时这也是极米连续第九次成为投影品类冠军。能够实现如此优秀的成绩&#xff0c;也…

JS逆向之webpack 通用扣取思路

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!标题 环境 win10chrome106目标站:aHR0cHM6Ly93d3cuZ205OS5jb20v 加密参数 password: K6YEmQrNy%2FQgdnac…

安卓玩机搞机技巧综合资源------EROFS分区格式 小米红米机型分区类型 刷写recovery方法列举【三】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 &#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d…

高性能数据访问中间件 OBProxy(七):安全、协议和监控

经过本系列前六篇文章的分布式特性介绍&#xff0c;相信大家已经了解了 OBProxy 在 OceanBase 数据库整体架构下的作用。本篇文章我们将换一个视角&#xff0c;介绍一些偏“中间件”的功能&#xff1a;安全、协议和监控功能。 从 OBProxy 整体来看&#xff0c;安全、协议和监控…

Scratch少儿编程英语教程

Scratch少儿编程英语教程 在 Scratch 中学习编程、创建游戏、玩得开心&#xff01;致未来编码员的家长和老师 课程英文名&#xff1a;Programming for Kids and Beginners Learn to Code in Scratch 此视频教程共5.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印…

网上图书商城小程序毕业设计,微信图书商城小程序系统设计与实现,微信小程序毕业设计论文怎么写毕设源码开题报告需求分析怎么做

功能清单 【后台管理员功能】 会员列表&#xff1a;查看所有注册会员信息&#xff0c;支持删除 录入资讯&#xff1a;录入资讯标题、内容等信息 管理资讯&#xff1a;查看已录入资讯列表&#xff0c;支持删除和修改 广告设置&#xff1a;上传图片和设置小程序首页轮播图广告地…

QT(3)-QTableView

QTableView1 说明2 常用函数2.1 clearSpans2.2 setSpan2.3 columnAt2.4 rowAt2.5 columnSpan2.6 rowSpan2.7 columnViewportPosition2.8 rowViewportPosition2.9 列宽、行高2.9.1 columnWidth2.9.2 rowHeight2.9.3 setColumnWidth2.9.4 setRowHeight2.9.5 resizeColumnToConten…