设计模式(五)原型模式详解

news/2024/10/25 13:26:14/

设计模式(五)原型模式详解

原型模型简介

  1. 定义:原型模型是一种创建型设计模型,它允许通过克隆/复制现有对象来创建新的对象,而无需通过常规的构造函数进行实例化。

  2. 这种方式的主要优势是在运行时不需要知道具体的类,只需一个实例对象即可。

  3. 实现方法

    • 实现Cloneable接口:在Java中,如果一个类想要支持克隆操作,通常需要实现Cloneable接口,并重写Object类中的clone()方法。

    • 深拷贝与浅拷贝

      浅拷贝:只复制对象本身,对于对象内部引用的其他对象,仍然共享同一个引用。

      深拷贝:不仅复制对象本身,还递归地复制对象内部引用的所有对象,确保新对象与原对象完全独立。

原型模式的关键组件
  • Prototype(抽象原型类):声明了一个克隆自身的接口,由于Java中已经提供了Cloneable接口,我们不需要再创建原型接口。

  • ConcretePrototype(具体原型类):创建一个Video类,实现Cloneable接口。

  • Client(客户端):使用原型类提供的克隆方法来获取新对象。

浅克隆
java">package com.briup.patterns_design.prototype.demo01;import java.util.Date;/*** 原型模式 -- 浅拷贝* @author 35329** 如何实现克隆/ 拷贝* 1、实现一个接口* 2、重写一个方法*/
// Video原型类
public class Video implements Cloneable{ // 无良up主,克隆别人的视频private String name;private Date createTime;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public Video() {}public Video(String name, Date createTime) {this.name = name;this.createTime = createTime;}@Overridepublic String toString() {return "Video{" +"name='" + name + '\'' +", createTime=" + createTime +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}
}
java">package com.briup.patterns_design.prototype.demo01;import java.util.Date;/*** @author 35329*/
public class BiliBiliClient {public static void main(String[] args) throws CloneNotSupportedException {// 原型对象 v1Date date = new Date();Video v1 = new Video("原型模式学习", date);System.out.println("v1 = " + v1);System.out.println("v1.hashCode() = " + v1.hashCode());// v1 克隆 v2// Video v2 = new Video("原型模式学习", date); 原始写法Video v2 = (Video) v1.clone(); // 克隆出来的对象和原来的一模一样System.out.println("v2 = " + v2);System.out.println("v2.hashCode() = " + v2.hashCode());v2.setName("Clone:原型模式学习");System.out.println(v2);}
}

深克隆
java">package com.briup.patterns_design.prototype.demo02;import java.util.Date;/*** 原型模式 -- 深拷贝* @author 35329** 如何实现克隆/ 拷贝* 1、实现一个接口* 2、重写一个方法*/
// Video原型类
public class Video implements Cloneable{ // 无良up主,克隆别人的视频private String name;private Date createTime;@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = super.clone();// 实现深克隆 ~ 序列化、反序列化Video v = (Video) obj;// 将这个对象的属性页进行克隆v.createTime = (Date) this.createTime.clone();return obj;}public Video() {}public Video(String name, Date createTime) {this.name = name;this.createTime = createTime;}@Overridepublic String toString() {return "Video{" +"name='" + name + '\'' +", createTime=" + createTime +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}
}
java">package com.briup.patterns_design.prototype.demo02;import java.util.Date;/*** @author 35329** 应用场景:* Spring Bean:单例模式,原型模式* 原型模式 + 工厂模式 ==> new <=替换为=>原型模式**/
public class BiliBiliClient {public static void main(String[] args) throws CloneNotSupportedException {// 原型对象 v1Date date = new Date();Video v1 = new Video("原型模式学习", date);Video v2 = (Video) v1.clone(); // 克隆出来的对象和原来的一模一样System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);System.out.println("=================================");date.setTime(5654251);System.out.println("v1 = " + v1);System.out.println("v2 = " + v2);}
}

小结

本文详细介绍了原型模式的概念、应用场景以及如何在Java中实现原型模式原型模式通过复制现有的对象来创建新的对象,有助于在运行时动态地创建和修改对象。通过实现Cloneable接口并重写clone()方法,可以方便地实现对象的克隆。


http://www.ppmy.cn/news/1541834.html

相关文章

E108-GN系列GNSS多模卫星导航定位模块产品说明

E108-GN03和E108-GN04系列系列GNSS多模卫星定位导航模块&#xff0c;具有高性能、高集成度、低功耗、低成本等特点。该系列GNSS多模卫星定位导航模块支持BDS/GPS/GLONASS/GALILEO卫星定位&#xff0c;可多系统联合定位或多系统单独定位&#xff01;米级高精度定位&#xff0c;A…

探索现代软件开发中的持续集成与持续交付(CI/CD)实践

探索现代软件开发中的持续集成与持续交付&#xff08;CI/CD&#xff09;实践 随着软件开发的飞速进步&#xff0c;现代开发团队已经从传统的开发模式向更加自动化和灵活的开发流程转变。持续集成&#xff08;CI&#xff09; 与 持续交付&#xff08;CD&#xff09; 成为当下主…

【MATLAB代码】EKF和CDKF的对比

目录 主要特点 应用场景 运行结果展示 本MATLAB程序实现了扩展卡尔曼滤波&#xff08;EKF&#xff09;与协方差差分卡尔曼滤波&#xff08;CDKF&#xff09;在三维状态估计中的效果对比&#xff0c;为需要高精度定位与动态系统分析的用户提供了一种实用工具。通过直观的结果…

spark sql 广播模式参数

在 Spark SQL 中&#xff0c;广播&#xff08;Broadcast&#xff09;模式常用于处理 Join 操作时的小表与大表的场景&#xff0c;尤其是在小表较小&#xff0c;可以被广播到每个 Executor 时&#xff0c;能够显著提升性能&#xff0c;避免了分布式 Shuffle 的开销。 Spark SQL…

宝塔如何部署Django项目(前后端分离篇)

一、环境安装 1、安装相关软件 点击软件商店&#xff0c;安装下面软件 一、宝塔部署前端 1、打包Vue项目 打开Vue3项目&#xff0c;输入下面打包命令&#xff0c;对Vue项目进行打包&#xff0c; npm run build 2、部署前端 点击宝塔的网站&#xff0c;在PHP项目里点击添加…

短视频账号矩阵系统源码---独立saas技术部署

#短视频账号矩阵系统# #短视频矩阵源码# #短视频账号矩阵系统技术开发# 抖音seo账号矩阵系统&#xff0c;短视频矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“…

HarmonyOS第一课——HarmonyOS介绍

HarmonyOS第一课 HarmonyOS介绍 HarmonyOS是新一代的智能终端操作系统&#xff08;泛终端服务的载体&#xff09;&#xff1b; 智慧互联协同&#xff0c;全场景交互体验&#xff1b; 核心技术理念&#xff1a; 一次开发 多次部署&#xff1a; 预览 可视化开发UI适配 事件交…

Django项目创建

安装 pip install django 创建项目 首先打开powershell打开项目与创建到的文件夹 django-admin startproject django_demo01 django-admin startproject 项目名 多出了一个django_demo01的文件夹&#xff0c;这就是我们的项目了 打开项目文件夹&#xff0c;发现一个文件和…