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

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

原型模型简介

  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;

    @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;
    }
}
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 {
        // 原型对象 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);


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

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

相关推荐
Pasregret15 分钟前
访问者模式:分离数据结构与操作的设计模式
数据结构·设计模式·访问者模式
24k小善1 小时前
Flink TaskManager详解
java·大数据·flink·云计算
想不明白的过度思考者1 小时前
Java从入门到“放弃”(精通)之旅——JavaSE终篇(异常)
java·开发语言
.生产的驴1 小时前
SpringBoot 封装统一API返回格式对象 标准化开发 请求封装 统一格式处理
java·数据库·spring boot·后端·spring·eclipse·maven
猿周LV2 小时前
JMeter 安装及使用 [软件测试工具]
java·测试工具·jmeter·单元测试·压力测试
晨集2 小时前
Uni-App 多端电子合同开源项目介绍
java·spring boot·uni-app·电子合同
时间之城2 小时前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel
椰羊~王小美2 小时前
LeetCode -- Flora -- edit 2025-04-25
java·开发语言
凯酱2 小时前
MyBatis-Plus分页插件的使用
java·tomcat·mybatis
程序员总部2 小时前
如何在IDEA中高效使用Test注解进行单元测试?
java·单元测试·intellij-idea