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

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

原型模型简介

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

相关推荐
shushangyun_1 小时前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
她说..1 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
学渣超1 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构
掉鱼的猫1 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·llm·aigc
带刺的坐椅2 小时前
Agent Harness 实战指南:构建生产级 AI Agent 的"马具"框架
java·ai·llm·agent·solon-ai
c238562 小时前
互斥锁高频面试题全解:从基础概念到底层实现,一文通关
java·c++·面试·职场和发展
error:(2 小时前
【系统与实战双精通】VS Code 调试 ROS2 Python 节点与 Launch 系统指南
android·java·python
Tian_Hang3 小时前
Eclipse Ditto 的权限策略
java·服务器·前端·网络·ide·ubuntu·eclipse
饼干哥哥3 小时前
我开发了一个「吃掉」别人Skill来升级的饕餮.Skill,现在免费开源
人工智能·设计模式·开源
小蓝波3 小时前
docker 的命令
java·docker·容器