当前位置: 首页 > news >正文

【设计模式之原型模式——矩形原型】

原型模式的基本实现

创建⼀个抽象类或接⼝,声明⼀个克隆⽅法 clone
具体原型类去实现接口,重写克隆⽅法
客户端中实例化具体原型类的对象,并调⽤其克隆⽅法来(赋给)创建新的对象。


什么时候实现原型模式 ?

相⽐于直接实例化对象,通过原型模式复制对象可以减少资源消耗,提⾼性能,尤其在对象的创建过程复杂或对象 的创建代价较⼤的情况下。当需要频繁创建相似对象、并且可以通过克隆避免重复初始化⼯作的场景时可以考虑使 ⽤原型模式,在克隆对象的时候还可以动态地添加或删除原型对象的属性,创造出相似但不完全相同的对象,提⾼了灵活性。 但是使⽤原型模式也需要考虑到如果对象的内部状态包含了引⽤类型的成员变量,那么实现深拷⻉就会变得较为复杂,需要考虑引⽤类型对象的克隆问题。

题目描述
公司正在开发一个图形设计软件,其中有一个常用的图形元素是矩形。设计师在工作时可能需要频繁地创建相似的矩形,而这些矩形的基本属性是相同的(颜色、宽度、高度),为了提高设计师的工作效率,请你使用原型模式设计一个矩形对象的原型。使用该原型可以快速克隆生成新的矩形对象。


输入描述
首先输入一个字符串,表示矩形的基本属性信息,包括颜色、长度和宽度,用空格分隔,例如 “Red 10 5”。

然后输入一个整数 N(1 ≤ N ≤ 100),表示使用原型创建的矩形数量。

输出描述
对于每个矩形,输出一行字符串表示矩形的详细信息,如 “Color: Red, Width: 10,Height: 5”。

输入示例
Red 10 5
3

输出示例
Color: Red, Width: 10, Height: 5
Color: Red, Width: 10, Height: 5
Color: Red, Width: 10, Height: 5


import java.util.Scanner;class OrginalObject implements Cloneable{private String color;private int width;private int height;//初始化public OrginalObject(String color,int width,int height){this.color=color;this.width=width;this.height=height;}// 克隆方法@Overridepublic OrginalObject clone(){try{return (OrginalObject) super.clone();//重写 clone()方法时,你需要将Object类型转换为你的具体类类型}catch(CloneNotSupportedException e){e.printStackTrace();return null;}}// 获取详细信息public String getResult(){return "Color:" + color + ",Width:" + width + ",Height:" + height;}
}public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);String color=sc.next();int width=sc.nextInt();int height=sc.nextInt();//创建原型对象OrginalObject orginalOb=new OrginalObject(color,width,height);//所需创建矩形的数量int n=sc.nextInt();for(int i=0; i<n; i++){//原型调用clone方法给予clonedObject,原型类可以提供对象的复制功能OrginalObject clonedObject=orginalOb.clone();System.out.println(clonedObject.getResult());}}
}

假设你有一个 Document 类,用于创建文档对象。你可以使用原型模式来复制文档——示例:

import java.util.HashMap;
import java.util.Map;// 原型接口
public interface Prototype {Prototype clone();
}// 具体原型类
public class Document implements Prototype {private Map<String, Object> attributes;public Document() {attributes = new HashMap<>();}public void setAttribute(String key, Object value) {attributes.put(key, value);}public Object getAttribute(String key) {return attributes.get(key);}@Overridepublic Document clone() {Document clone = new Document();clone.attributes.putAll(this.attributes); // 复制所有属性return clone;}@Overridepublic String toString() {return "Document{attributes=" + attributes + "}";}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建一个原始文档对象Document originalDocument = new Document();originalDocument.setAttribute("Title", "Original Title"); // 设置 Title 属性originalDocument.setAttribute("Content", "Original Content"); // 设置 Content 属性// 通过原型模式复制文档Document clonedDocument = originalDocument.clone();//克隆当前对象,并复制所有属性到新对象中clonedDocument.setAttribute("Title", "Cloned Title");// 修改克隆文档的 Title 属性clonedDocument.setAttribute("Author", "New Author");// 添加新的属性 Author// 输出结果System.out.println("Original Document: " + originalDocument);System.out.println("Cloned Document: " + clonedDocument);}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • javacv-ffmpeg ProcessBuilder实现对图片的旋转
  • 【MySQL数据库管理问答题】第1章 MySQL 简介
  • 一文讲清协同过滤,矩阵分解,spark als,显示反馈与隐式反馈
  • 蓝牙耳机百元内怎么选?四款上榜百元品牌机型合集
  • HTB-Explosion(rdp连接)和preignition(目录遍历)
  • 外包干了2年,女朋友跑了...
  • 【Linux】基本命令(第二篇)
  • 【系统分析师】-综合知识-计算机网络与信息安全
  • 无损放大图片,盘点5款最新无损放大图片软件
  • Python和MATLAB和R对比敏感度函数导图
  • Redis单线程和多线程
  • YOLOv8目标检测部署RK3588全过程,附代码pt->onnx->rknn,附【详细代码】
  • Apache Doris 使用 CBO 和 RBO 结合的优化策略
  • JMeter Plugins之内网插件问题解决
  • 【C++】继承详解
  • 0基础学习移动端适配
  • 2017 年终总结 —— 在路上
  • Angular4 模板式表单用法以及验证
  • angular学习第一篇-----环境搭建
  • axios 和 cookie 的那些事
  • co模块的前端实现
  • ECS应用管理最佳实践
  • extjs4学习之配置
  • JavaScript实现分页效果
  • Java精华积累:初学者都应该搞懂的问题
  • JS函数式编程 数组部分风格 ES6版
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nginx 负载服务器优化
  • ucore操作系统实验笔记 - 重新理解中断
  • vue总结
  • - 概述 - 《设计模式(极简c++版)》
  • 记一次用 NodeJs 实现模拟登录的思路
  • 新版博客前端前瞻
  • 回归生活:清理微信公众号
  • ​linux启动进程的方式
  • # Apache SeaTunnel 究竟是什么?
  • #etcd#安装时出错
  • (02)Unity使用在线AI大模型(调用Python)
  • (MATLAB)第五章-矩阵运算
  • (笔试题)分解质因式
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (区间dp) (经典例题) 石子合并
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一)Neo4j下载安装以及初次使用
  • (转)关于pipe()的详细解析
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转载)hibernate缓存
  • .gitignore文件设置了忽略但不生效
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET BackgroundWorker
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)