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

23种设计模式之原型模式

目录

什么是原型模式

为什么使用原型模式 

原型模式的基本结构 

 原型模式的实现步骤

实现代码(含注释) 

使用场景 


什么是原型模式

原型模式是一种创建型设计模式,该模式的核心思想是基于现有的对象创建新的对象,而不是从头开始创建。在原型模式中,通常有一个原型对象,它被用作创建新对象的末班。新对象通过复制原型对象的属性和状态来创建,而无需知道具体的创建细节。

为什么使用原型模式 

每次创建对象时都会消耗资源,而通过原型模式就可以复制现有的对象来迅速克隆一个新的对象,可以降低对象创建的成本。

原型模式的基本结构 

实现原型模式需要结合原型对象声明一个克隆方法clone(),执行该方法会创建一个当前类的新对象,并将原始对象中的成员变量复制到新生成的对象中,而不必实例化。并且在这个过程中只需要调用原型对象的克隆方法,而无需知道 原型对象的具体类型。

原型对象主要包括两个重点模块:

  • Prototype抽象原型接口:声明一个克隆的方法clone
  • ConcretePrototype具体原型类:实现clone方法,复制当前对象并返回一个新对象

 原型模式的实现步骤

  1. 创建一个抽象类或者接口,声明一个克隆方法clone
  2. 实现具体原型类,重写克隆方法
  3. 客户端中实例化具体原型类的对象,并调用克隆方法来创建新的对象

实现代码(含注释) 

//原型模式
//1.定义抽象原型类
abstract class Prototype implements Cloneable{@Overridepublic abstract Prototype clone();
}
//2.实现具体原型类
class ConcretePrototype extends Prototype{private String data;public ConcretePrototype(String data){this.data=data;}@Overridepublic Prototype clone() {return new ConcretePrototype(this.data);}public String getData(){return data;}
}
//3.客户端代码
public class Client {public static void main(String[] args) {
//       实例化具体原型对象Prototype original=new ConcretePrototype("Original Data");
//        克隆原型对象Prototype clone=original.clone();
//        输出克隆的数据System.out.println("Clone Data:"+((ConcretePrototype)clone).getData());}
}

使用场景 

相比于直接实例化对象,通过原型模式复制对象可以减少资源消耗,提⾼性能,尤其在对象的创建过程复杂或对象的创建代价较大的情况下。当需要频繁创建相似对象、并且可以通过克隆避免重复初始化⼯作的场景时可以考虑使用原型模式,在克隆对象的时候还可以动态地添加或删除原型对象的属性,创造出相似但不完全相同的对象,提高了灵活性。

相关文章:

  • Linux操作系统基础(九):Linux用户与权限
  • 勒索病毒最新变种.faust勒索病毒来袭,如何恢复受感染的数据?
  • 贪心算法练习day1
  • postgresql 手动清理wal日志的101个坑
  • Mock.js
  • Python三级考试笔记
  • 谁拿了最多奖学金——NOIP 2005 提高组
  • 《MySQL 简易速速上手小册》第10章:未来趋势和进阶资源(2024 最新版)
  • 论文阅读 - Non-Local Spatial Propagation Network for Depth Completion
  • 机器学习:过拟合和欠拟合的介绍与解决方法
  • django中实现登录
  • 一、部署Oracle
  • php基础学习之分支结构和循环结构(不细讲,来对比一下和两大常用高级编程语言(C++/Java)的细微区别以便记忆)
  • 微服务设计:Spring Cloud API 网关概述
  • OpenVDB Cookbook 笔记
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【知识碎片】第三方登录弹窗效果
  • 11111111
  • angular2 简述
  • nginx 负载服务器优化
  • React组件设计模式(一)
  • Redash本地开发环境搭建
  • Sass Day-01
  • v-if和v-for连用出现的问题
  • 阿里云购买磁盘后挂载
  • 对超线程几个不同角度的解释
  • 力扣(LeetCode)357
  • 扑朔迷离的属性和特性【彻底弄清】
  • 说说动画卡顿的解决方案
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 正则表达式
  • Android开发者必备:推荐一款助力开发的开源APP
  • RDS-Mysql 物理备份恢复到本地数据库上
  • Spring Batch JSON 支持
  • 如何在招聘中考核.NET架构师
  • ​如何防止网络攻击?
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (2)Java 简介
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (6)STL算法之转换
  • (6)添加vue-cookie
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (七)c52学习之旅-中断
  • (十) 初识 Docker file
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)c++ std::pair 与 std::make
  • (转)visual stdio 书签功能介绍
  • .gitignore
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)