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

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

原型模型简介

  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()方法,可以方便地实现对象的克隆。

相关推荐
都叫我大帅哥1 小时前
深入浅出 Resilience4j:Java 微服务的“免疫系统”实战指南
java·spring cloud
Cao_Shixin攻城狮3 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
Dcs5 小时前
还在用 Arrays.hashCode?Java 自己也能写出更快的版本!
java
fouryears_234177 小时前
Spring,Spring Boot 和 Spring MVC 的关系以及区别
java·spring boot·spring·mvc
阿葱(聪)8 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
浮生带你学Java8 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
板板正9 小时前
SpringAI——提示词(Prompt)、提示词模板(PromptTemplate)
java·spring boot·ai·prompt
板板正9 小时前
SpringAI——对话记忆
java·spring boot·ai
期待のcode9 小时前
图片上传实现
java·前端·javascript·数据库·servlet·交互
李长渊哦9 小时前
深入理解Java中的Map.Entry接口
java·开发语言