原型模式

  • 描述
  • 实现
  • 使用场景

描述

原型模式(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为浅拷贝。如果需要深拷贝,我们需要重新自己写一个克隆方法来进行深拷贝。


使用场景

  • 当需要创建的对象具有相同的属性和方法时,但其状态不同,例如游戏中的敌人,它们具有相同的属性和方法,但具有不同的血量、攻击力等状态。

  • 当创建对象的过程非常昂贵或复杂时,例如数据库连接对象、网络连接对象等。在这种情况下,通过复制现有对象,可以避免重复创建对象,从而提高性能。

  • 当需要避免构造函数被反复调用时,例如在某些系统中,构造函数可能会执行一些昂贵的计算或操作,通过使用原型模式,可以避免这些计算或操作被反复执行

原型模式(设计模式详解)相关推荐

  1. Java设计模式之原型模式最详解(类图+源码)

    原型模式 原型模式概述:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象. 原型模式包含的角色 抽象原型类:规定了具体原型对象必须实现的clone()方法. 具体原型类 ...

  2. 《设计模式详解》创建型模式 - 原型模式

    原型模式 4.3 原型模式 4.3.1 概述 4.3.2 结构 4.3.3 实现 4.3.4 案例 4.3.5 使用场景 4.3.6 扩展 - 深克隆 引用对象的浅克隆 实现 1:文件流 + 对象流 ...

  3. 《设计模式详解》创建型模式 - 建造者模式

    建造者模式 4.4 建造者模式 4.4.1 概述 4.4.2 结构 4.4.3 实例 4.4.4 优缺点 4.4.5 使用场景 4.4.6 扩展 - 构建对象 重构前 重构后 4.5 创建型模式对比 ...

  4. 《设计模式详解》创建型模式 - 工厂模式

    <设计模式详解> 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. ...

  5. python类是实例的工厂_Python设计模式之工厂方法模式实例详解

    本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...

  6. 《设计模式详解》行为型模式 - 解释器模式

    解释器模式 6.11 解释器模式 6.11.1 概述 6.11.2 结构 6.11.3 案例实现 6.11.4 优缺点 6.11.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢 ...

  7. 《设计模式详解》行为型模式 - 备忘录模式

    备忘录模式 6.10 备忘录模式 6.10.1 概述 6.10.2 结构 6.10.3 案例实现 "白箱" 备忘录模式 "黑箱" 备忘录模式 6.10.4 优缺 ...

  8. 《设计模式详解》行为型模式 - 中介者模式

    中介者模式 6.7 中介者模式 6.7.1 概述 6.7.2 结构 6.7.3 案例实现 6.7.4 优缺点 6.7.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 6 ...

  9. 《设计模式详解》行为型模式 - 观察者模式

    观察者模式 6.6 观察者模式 6.6.1 概述 6.6.2 结构 6.6.3 案例实现 6.6.4 优缺点 6.6.5 使用场景 6.6.6 JDK 提供的实现 - Observable 示例 完整 ...

  10. 《设计模式详解》行为型模式 - 状态模式

    状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...

最新文章

  1. JSON字符串key缺少双引号的解决方法
  2. 第10章:项目沟通管理和干系人管理-章节重点
  3. 装饰器 闭包 生成器 迭代器
  4. form-validation-engine中的正则表达式
  5. 科技部:基础研究十年行动方案将制定,支持冷门学科等发展
  6. mysql 日志同步 数据不同步_Mysql互为主从问题--日志同步数据不同步
  7. 导航栏iframe公共样式_中秋节微信公众号推文样式素材推荐
  8. C语言 | 输出平均成绩最高学生的信息
  9. java 获取当前方法的名称_Java中获取当前函数名
  10. java jdbc_详解Java基础知识——JDBC
  11. 去掉Scala的糖衣(4) -- Type Aliase
  12. C++(一)#pragma once用法
  13. 新点软件怎么导入清单_新点软件怎么导入excel清单表格 表格有什么要求???...
  14. 超级好用的 excel 导入导出框架:excel-import-export
  15. 已删除的回收站文件恢复方法
  16. 【好消息】高录用、EI检索会议 | 2023年第二届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2023)
  17. 用“分区助手”(PartAssist)给C盘扩容
  18. C# 求Sn=a+aa+aaa+...+aa...a(n个a)的值
  19. 用python生成纯色图像
  20. JDBC:PreparedStatement 插入BLOB类型的数据,PreparedStatement 批量处理,Connection 事务处理

热门文章

  1. Linux下统计某个目录下所有源代码行数的Shell脚本
  2. 使用python selenium 代码在豆瓣发回复顶贴
  3. 如何避免输入中文拼音时触发input事件?
  4. 参与就能免费领取100小时GPU算力卡
  5. Java 实验报告 了解如何使用类及其成员的修饰符,理解类的继承性,掌握方法的继承、重载和覆盖
  6. Android不需要权限也能关机、重启的实现
  7. php 依赖倒置原则,依赖倒置原则 - LieBrother的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. MSF(Metasploit Framework)框架详解
  9. 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验02 分支与循环程序设计(2021级)(4)
  10. 新浪、腾讯股票价格相关接口