原型模式(设计模式详解)
原型模式
- 描述
- 实现
- 使用场景
描述
原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需从头开始编写代码。
在原型模式中,一个原型对象作为模板,新的对象通过克隆这个原型对象而创建。这样可以避免使用相同的代码来创建相似的对象,同时也可以提高创建对象的效率。通常情况下,原型模式会使用一个原型管理器来存储和管理原型对象,以便在需要的时候进行复制。
原型模式适用于需要创建大量相似对象的场景,如图形编辑器中的图形对象、数据库中的数据对象、网络传输中的数据包等。通过使用原型模式,可以大大提高对象创建的效率和代码复用性。
实现
public class Client {public static void main(String[] args) {Car car = new Car("丰田", 140000);Prototype prototype = new Prototype();prototype.registerObj("丰田",car);Car cloneCar = prototype.clone("丰田");System.out.println(car == cloneCar);System.out.println(cloneCar);}
}/*** 原型对象*/
class Prototype {//存放实例的mapprivate Map<String, Object> prototypeMap;public Prototype() {this.prototypeMap = new HashMap<>();}//注册对象public void registerObj(String name,Object o){prototypeMap.put(name,o);}public void unRegisterObj(String name){prototypeMap.remove(name);}public Car clone(String name){return ((Car)(prototypeMap.get(name))).clone();}
}/*** Car继承Cloneable*/
class Car implements Cloneable{private String carName;private int price;public Car(){}public Car(String carName, int price) {this.carName = carName;this.price = price;}public Car clone(){try {return (Car) super.clone();} catch (CloneNotSupportedException e) {return new Car(this.carName,this.price);}}@Overridepublic String toString() {return "Car{" +"carName='" + carName + '\'' +", price=" + price +'}';}
}
对于对象的拷贝是使用jdk自带的clone,那么就会有个问题,拷贝是属于深拷贝还是浅拷贝呢?
深拷贝:深拷贝(Deep Copy)是指在进行对象复制时,将被复制对象的所有成员变量都复制一份到新的对象中,而不是仅仅复制对象的引用。
浅拷贝:,浅拷贝(Shallow Copy)仅仅复制对象的引用,而不是对象本身的成员变量。因此,如果原对象发生变化,浅拷贝后的新对象也会受到影响。
我们来测试一下。我们把Car修改成以下代码
class Car implements Cloneable{private String carName;private int price;private Object from;public Car(){}public Car(String carName, int price,Object from) {this.carName = carName;this.price = price;this.from = from;}public Car clone(){try {return (Car) super.clone();} catch (CloneNotSupportedException e) {return new Car(this.carName,this.price,this.from);}}@Overridepublic String toString() {return "Car{" +"carName='" + carName + '\'' +", price=" + price +'}';}public String getCarName() {return carName;}public int getPrice() {return price;}public Object getFrom() {return from;}
}
当克隆后我们比对引用类型的属性
Car car = new Car("丰田", 140000,new Object());Prototype prototype = new Prototype();prototype.registerObj("丰田",car);Car cloneCar = prototype.clone("丰田");System.out.println(cloneCar.getFrom() == car.getFrom());
发现克隆的对象的引用属性和被克隆的对象引用属性的地址一致。
通过以上结论,我们可以知道,jdk的clone为浅拷贝。如果需要深拷贝,我们需要重新自己写一个克隆方法来进行深拷贝。
使用场景
当需要创建的对象具有相同的属性和方法时,但其状态不同,例如游戏中的敌人,它们具有相同的属性和方法,但具有不同的血量、攻击力等状态。
当创建对象的过程非常昂贵或复杂时,例如数据库连接对象、网络连接对象等。在这种情况下,通过复制现有对象,可以避免重复创建对象,从而提高性能。
当需要避免构造函数被反复调用时,例如在某些系统中,构造函数可能会执行一些昂贵的计算或操作,通过使用原型模式,可以避免这些计算或操作被反复执行
原型模式(设计模式详解)相关推荐
- Java设计模式之原型模式最详解(类图+源码)
原型模式 原型模式概述:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象. 原型模式包含的角色 抽象原型类:规定了具体原型对象必须实现的clone()方法. 具体原型类 ...
- 《设计模式详解》创建型模式 - 原型模式
原型模式 4.3 原型模式 4.3.1 概述 4.3.2 结构 4.3.3 实现 4.3.4 案例 4.3.5 使用场景 4.3.6 扩展 - 深克隆 引用对象的浅克隆 实现 1:文件流 + 对象流 ...
- 《设计模式详解》创建型模式 - 建造者模式
建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...
- 《设计模式详解》创建型模式 - 工厂模式
<设计模式详解> 4.2 工厂模式 4.2.1 概述 4.2.2 简单工厂模式 4.2.2.1 结构 4.2.2.2 实现 4.2.2.3 优缺点 4.2.2.4 扩展 - 静态工厂 4. ...
- python类是实例的工厂_Python设计模式之工厂方法模式实例详解
本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...
- 《设计模式详解》行为型模式 - 解释器模式
解释器模式 6.11 解释器模式 6.11.1 概述 6.11.2 结构 6.11.3 案例实现 6.11.4 优缺点 6.11.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢 ...
- 《设计模式详解》行为型模式 - 备忘录模式
备忘录模式 6.10 备忘录模式 6.10.1 概述 6.10.2 结构 6.10.3 案例实现 "白箱" 备忘录模式 "黑箱" 备忘录模式 6.10.4 优缺 ...
- 《设计模式详解》行为型模式 - 中介者模式
中介者模式 6.7 中介者模式 6.7.1 概述 6.7.2 结构 6.7.3 案例实现 6.7.4 优缺点 6.7.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 6 ...
- 《设计模式详解》行为型模式 - 观察者模式
观察者模式 6.6 观察者模式 6.6.1 概述 6.6.2 结构 6.6.3 案例实现 6.6.4 优缺点 6.6.5 使用场景 6.6.6 JDK 提供的实现 - Observable 示例 完整 ...
- 《设计模式详解》行为型模式 - 状态模式
状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...
最新文章
- JSON字符串key缺少双引号的解决方法
- 第10章:项目沟通管理和干系人管理-章节重点
- 装饰器 闭包 生成器 迭代器
- form-validation-engine中的正则表达式
- 科技部:基础研究十年行动方案将制定,支持冷门学科等发展
- mysql 日志同步 数据不同步_Mysql互为主从问题--日志同步数据不同步
- 导航栏iframe公共样式_中秋节微信公众号推文样式素材推荐
- C语言 | 输出平均成绩最高学生的信息
- java 获取当前方法的名称_Java中获取当前函数名
- java jdbc_详解Java基础知识——JDBC
- 去掉Scala的糖衣(4) -- Type Aliase
- C++(一)#pragma once用法
- 新点软件怎么导入清单_新点软件怎么导入excel清单表格 表格有什么要求???...
- 超级好用的 excel 导入导出框架:excel-import-export
- 已删除的回收站文件恢复方法
- 【好消息】高录用、EI检索会议 | 2023年第二届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2023)
- 用“分区助手”(PartAssist)给C盘扩容
- C# 求Sn=a+aa+aaa+...+aa...a(n个a)的值
- 用python生成纯色图像
- JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理
热门文章
- Linux下统计某个目录下所有源代码行数的Shell脚本
- 使用python selenium 代码在豆瓣发回复顶贴
- 如何避免输入中文拼音时触发input事件?
- 参与就能免费领取100小时GPU算力卡
- Java 实验报告 了解如何使用类及其成员的修饰符,理解类的继承性,掌握方法的继承、重载和覆盖
- Android不需要权限也能关机、重启的实现
- php 依赖倒置原则,依赖倒置原则 - LieBrother的个人空间 - OSCHINA - 中文开源技术交流社区...
- MSF(Metasploit Framework)框架详解
- 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验02 分支与循环程序设计(2021级)(4)
- 新浪、腾讯股票价格相关接口