首页 > 其他分享 >设计模式(五)原型模式详解

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

时间:2024-10-24 10:50:53浏览次数:3  
标签:name public 详解 Video Date 原型 设计模式 createTime

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

原型模型简介

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

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

  3. 实现方法

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

    • 深拷贝与浅拷贝

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

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

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

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

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

浅克隆
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;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    public Video() {
    }

    public Video(String name, Date createTime) {
        this.name = name;
        this.createTime = createTime;
    }

    @Override
    public 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;
    }
}
package com.briup.patterns_design.prototype.demo01;

import java.util.Date;

/**
 * @author 35329
 */
public class BiliBiliClient {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 原型对象 v1
        Date 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);


    }
}

深克隆
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;

    @Override
    protected 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;
    }

    @Override
    public 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;
    }
}
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 {
        // 原型对象 v1
        Date 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()方法,可以方便地实现对象的克隆。

标签:name,public,详解,Video,Date,原型,设计模式,createTime
From: https://blog.csdn.net/2301_77032029/article/details/143193993

相关文章

  • 【Linux】线程ID、线程封装(详解)
    线程ID认识线程ID怎么查看一个线程的ID呢?                                                       线程库NPTL提供了pthread_self函数,可以获得线程......
  • Dockerfile和docker-compose详解
    Dockerfile和docker-compose详解文章目录Dockerfile和docker-compose详解一、Dockerfile1.Dockerfile简介2.构建镜像3.Dockerfile命令(1)FROM(2)WORKDIR(3)RUN(4)COPY(5)EXPOSE(6)CMD二、docker-compose1.简介2.多服务实例(1)文件准备(2)启动服务(3)访问服务3.docker-compose的s......
  • JavaWeb开发实战详解
    JavaWeb开发在现代应用程序中有广泛的应用场景。以下是一些常见的JavaWeb应用类型及其示例:1.企业级应用特点:通常需要处理大量的数据和用户,具有复杂的业务逻辑,常用于企业内部。示例:客户关系管理(CRM)系统、企业资源计划(ERP)系统。技术栈:SpringFramework、Hibernate、JPA、Th......
  • Cursor零基础小白教程系列「进阶」 - Cursor 智能代码补全详解(Tab)
    最适合小白零基础的Cursor教程网站lookai.top相同作者,最新文章会在网站更新,欢迎收藏书签Cursor智能代码补全详解(Tab)概述Cursor的智能代码补全,也就是快捷键Tab,是其最强大和独特的AI辅助编程工具之一。本教程将详细介绍Tab功能的使用方法,通过掌握Tab功能,您将显著提......
  • 行为设计模式 -观察者模式- JAVA
    责任链设计模式一.简介二.案例2.1抽象处理者(Handler)角色2.2具体处理者(ConcreteHandler)角色2.3测试三.结论3.1优缺点3.2示例3.3要点前言这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。作者:神的孩子都在歌唱一.简介......
  • stm32入门教程--UART协议详解
    目录简介UART串口协议串行通信并行通信串行通信与并行通信的区别单工通信半双工全双工同步和异步的区别UART帧结构简介STM32是意法半导体公司推出的一款32位ARMCortex-M系列微控制器。UART、SPI和I2C是STM32中常用的串行通信协议。UART(通用异步收发器):UART是一......
  • Elasticsearch 在linux部署 及 Docker 集群部署详解案例示范
    1.在CentOS上安装和配置Elasticsearch在CentOS系统下,安装Elasticsearch主要分为以下步骤:1.1准备工作在开始安装之前,确保你的系统满足以下基本条件:CentOS版本要求:推荐使用CentOS7及以上版本。Java环境:Elasticsearch依赖于Java运行时环境(JRE)。需要确......
  • Java Spring的常用注解详解和案例示范
    1.Spring常用注解概述1.1@Component@Component是Spring的基础注解之一,它用于将类标记为Spring容器中的一个组件。通过@Component注解,Spring会自动将该类注册为一个Bean,供依赖注入使用。使用示例:@ComponentpublicclassUserService{publicvoidperf......
  • .上下数据流图 1 二. 数据库模型 1 三. 页面原型 2
     目录一.上下数据流图 1二.数据库模型1三.页面原型 一.上下数据流图  二.数据库  三.页面原型1.先看一下大框  生产报工  工序过设置和工序流程设置    最重要的报工  点击二维码报工  手机端报工  ......
  • Java设计模式的学习之适配器模式
    适配器模式目录适配器模式适配器模式的主要角色包括:适配器模式的两种主要形式:应用场景:优点:缺点:适配器模式(AdapterPattern)是一种结构型设计模式,其主要目的是将一个类的接口转换成客户端期望的另一个接口,使得原本因接口不兼容而不能一起工作的类可以一起工作。适配器模式通常用......