博客
关于我
GoF23 原型模式学习笔记
阅读量:285 次
发布时间:2019-03-03

本文共 3742 字,大约阅读时间需要 12 分钟。

GoF23 原型模式学习笔记

原型模式(Prototype Pattern)是一种软件设计模式,允许你通过复制现有的对象来创建新对象,而不必重新编写代码。这个模式特别适用于需要多次创建对象的情况,能够有效减少代码冗余。

实现Cloneable接口与重写clone方法

在Java中,实现Cloneable接口并重写clone方法是使用原型模式的关键步骤。通过这种方式,类可以定义自己的复制机制,而不是直接继承自Object类的clone方法。

应用场景
  • Spring Bean的创建:在Spring框架中,单例模式和原型模式常常配合使用。原型模式通过动态生成新实例,避免了单例模式中对象状态固定的问题。
  • 与工厂模式结合使用:原型模式通常与工厂模式一起使用,工厂模式负责创建具体实例,而原型模式负责复制这些实例。
  • 浅拷贝与深拷贝的区别

    在原型模式中,复制对象的方式分为浅拷贝和深拷贝两种:

  • 浅拷贝

    • 浅拷贝仅复制对象的引用,而不是复制对象的所有属性。
    • 代码中表现为:cloneVideo.publishTime 只是指向了原 videopublishTime
  • 深拷贝

    • 深拷贝复制对象的所有属性,包括对象的引用属性。
    • 代码中表现为:在 Video 类的 clone 方法中,publishTime 被深拷贝后独立于原对象。

  • 代码示例

    浅拷贝实现

    package prototype.shallow;import java.util.Date;public class Video implements Cloneable {    private String name;    private Date publishTime;    public Video(String name, Date publishTime) {        this.name = name;        this.publishTime = publishTime;    }    public Video() {}    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Date getPublishTime() {        return publishTime;    }    public void setPublishTime(Date publishTime) {        this.publishTime = publishTime;    }    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();    }    @Override    public String toString() {        return "Video [name=" + name + ", publishTime=" + publishTime + "]";    }}

    浅拷贝测试

    package prototype.shallow;import java.util.Date;public class Main {    public static void main(String[] args) throws CloneNotSupportedException {        Date date = new Date();        Video video = new Video("VideoName", date);        Video cloneVideo = (Video) video.clone();        System.out.println(video); // 输出: Video [name=VideoName, publishTime=当前时间]        System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=当前时间]        date.setTime(1231241);        System.out.println(video); // 输出: Video [name=VideoName, publishTime=修改后的时间]        System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=修改后的时间]    }}

    深拷贝实现

    package prototype.deep;import java.util.Date;public class Video implements Cloneable {    private String name;    private Date publishTime;    public Video(String name, Date publishTime) {        this.name = name;        this.publishTime = publishTime;    }    public Video() {}    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Date getPublishTime() {        return publishTime;    }    public void setPublishTime(Date publishTime) {        this.publishTime = publishTime;    }    @Override    protected Object clone() throws CloneNotSupportedException {        Object obj = super.clone();        Video v = (Video) obj;        v.publishTime = (Date) this.publishTime.clone();        return obj;    }    @Override    public String toString() {        return "Video [name=" + name + ", publishTime=" + publishTime + "]";    }}

    深拷贝测试

    package prototype.deep;import java.util.Date;public class Main {    public static void main(String[] args) throws CloneNotSupportedException {        Date date = new Date();        Video video = new Video("VideoName", date);        Video cloneVideo = (Video) video.clone();        System.out.println(video); // 输出: Video [name=VideoName, publishTime=当前时间]        System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=当前时间]        date.setTime(1231241);        System.out.println(video); // 输出: Video [name=VideoName, publishTime=修改后的时间]        System.out.println(cloneVideo); // 输出: Video [name=VideoName, publishTime=修改后的时间]    }}

    总结

    通过实现 Cloneable 接口并重写 clone 方法,你可以在代码中轻松实现对象的复制。浅拷贝和深拷贝的区别在于,浅拷贝只复制对象的引用,而深拷贝复制对象的所有属性,包括对象的引用属性。在实际开发中,选择使用浅拷贝还是深拷贝取决于对象的复杂度和设计需求。

    转载地址:http://wssl.baihongyu.com/

    你可能感兴趣的文章
    PlutoSDR学习笔记(一)—函数API手册
    查看>>
    Quartz安装包中的15个example
    查看>>
    Quartz学习总结(2)——定时任务框架Quartz详解
    查看>>
    pm2 start命令中的json格式详解
    查看>>
    pm2启动报错
    查看>>
    pm2通过配置文件部署nodejs代码到服务器
    查看>>
    Unknown character set: 'utf8mb4'
    查看>>
    PML调用PDMS内核命令研究
    查看>>
    PMM安装-第一篇
    查看>>
    PMP知识要点(第九章)
    查看>>
    PNETLab 镜像包官方下载太慢?不急,最新版本PNET_4.2.10分享!
    查看>>
    pnpm : 无法加载文件...
    查看>>
    pnpm 如何安装指定版本
    查看>>
    pnpm的设计与npm的对比
    查看>>
    pocoserver无限重启_Poco::TCPServer框架解析
    查看>>
    POCO库中文编程参考指南(4)Poco::Net::IPAddress
    查看>>
    Quartz基本使用(二)
    查看>>
    POC项目安装与使用指南
    查看>>
    Podman核心技术详解
    查看>>
    pods 终端安装 第三方框架的一些命令
    查看>>