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

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

原型模型简介

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

相关推荐
长潇若雪9 分钟前
结构体(C 语言)
c语言·开发语言·经验分享·1024程序员节
feilieren11 分钟前
leetcode - 684. 冗余连接
java·开发语言·算法
The Future is mine22 分钟前
Java根据word模板导出数据
java·开发语言
一颗甜苞谷35 分钟前
开源一款前后端分离的企业级网站内容管理系统,支持站群管理、多平台静态化,多语言、全文检索的源码
java·开发语言·开源
星夜孤帆35 分钟前
Java面试题集锦
java·开发语言
论迹43 分钟前
【Java】-- 接口
java·开发语言
DARLING Zero two♡43 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.12——深入理解指针(2)
c语言·开发语言·科技·1024程序员节
独行soc1 小时前
#渗透测试#SRC漏洞挖掘# 信息收集-Shodan进阶之Jenkins组件
安全·jenkins·安全威胁分析·1024程序员节·shodan
dawn1912282 小时前
Java 中的正则表达式详解
java·开发语言·算法·正则表达式·1024程序员节
葉A子2 小时前
poi处理excel文档时,与lombok的@Accessors(chain = true)注解冲突
java