博客
关于我
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/

    你可能感兴趣的文章
    Objective-C实现Miller-Rabin素性测试程序(附完整源码)
    查看>>
    Objective-C实现MinhashLSH算法(附完整源码)
    查看>>
    Objective-C实现MinHeap最小堆算法(附完整源码)
    查看>>
    Objective-C实现multilayer perceptron classifier多层感知器分类器算法(附完整源码)
    查看>>
    Objective-C实现n body simulationn体模拟算法(附完整源码)
    查看>>
    Objective-C实现naive string search字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现natural sort自然排序算法(附完整源码)
    查看>>
    Objective-C实现nested brackets嵌套括号算法(附完整源码)
    查看>>
    Objective-C实现nevilles method多项式插值算法(附完整源码)
    查看>>
    Objective-C实现newtons second law of motion牛顿第二运动定律算法(附完整源码)
    查看>>
    Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现not gate非门算法(附完整源码)
    查看>>
    Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
    查看>>
    Objective-C实现n皇后问题算法(附完整源码)
    查看>>
    Objective-C实现OCR文字识别(附完整源码)
    查看>>
    Objective-C实现PageRank算法(附完整源码)
    查看>>
    Objective-C实现perfect cube完全立方数算法(附完整源码)
    查看>>
    Objective-C实现pollard rho大数分解算法(附完整源码)
    查看>>