前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >23种设计模式之原型模式

23种设计模式之原型模式

作者头像
暴躁的程序猿
发布2022-03-23 17:07:51
1840
发布2022-03-23 17:07:51
举报
文章被收录于专栏:阿飞的学习记录

原型模式

定义: 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

主要用于创建对象

原型模式实现只需要实现一个接口 重写clone()方法 。

我们实现中 会有深拷贝和浅拷贝两种情况。

浅克隆

创建一个羊类 作为prototype

代码语言:javascript
复制
public class Sheep{
    /**
     * name名字
     * creatTime 创建时间
     */
    private String name;
    private Date creatTime;

    public Sheep() {
    }

    public Sheep(String name, Date creatTime) {
        this.name = name;
        this.creatTime = creatTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Date creatTime) {
        this.creatTime = creatTime;
    }

    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", creatTime=" + creatTime +
                '}';
    }
}

实现一个Cloneable的接口

重写clone方法

代码语言:javascript
复制
/**
 * 克隆的步骤:
 *  1.实现一个接口  Cloneable
 *  2.重写一个方法
 * 羊的原型
 * @create: 2021/6/28
 * @author: Tony Stark
 */
public class Sheep implements Cloneable{
    /**
     * name名字
     * creatTime 创建时间
     */
    private String name;
    private Date creatTime;

    /**
     * 克隆的方法
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }


    public Sheep() {
    }

    public Sheep(String name, Date creatTime) {
        this.name = name;
        this.creatTime = creatTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Date creatTime) {
        this.creatTime = creatTime;
    }

    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", creatTime=" + creatTime +
                '}';
    }
}

创建一个克隆对象的客户端

先创建一个原型 羊的对象

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) {
        //创建一个原型对象
        Date date = new Date();
        Sheep sheep1 = new Sheep("喜洋洋",date);
        System.out.println("sheep1==>"+sheep1);
        System.out.println("sheep1==>hash"+sheep1.hashCode());
    }
}

我们克隆出一只羊

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        //创建一个原型对象
        Date date = new Date();
        Sheep sheep1 = new Sheep("喜洋洋",date);
        System.out.println("sheep1==>"+sheep1);
        System.out.println("sheep1==>hash"+sheep1.hashCode());

        //sheep1  克隆出一个 sheep2  克隆羊
        Sheep sheep2 = (Sheep)sheep1.clone();
        System.out.println("sheep2==>"+sheep2);
        System.out.println("sheep2==>hash"+sheep2.hashCode());
    }
}

可以看出我们已经成功克隆出来一模一样的对象了

小问题

这时候我们sheep1 和sheep2共同用了一个date对象

但是如果我们修改data对象的值 我们会发现一个问题

代码语言:javascript
复制
public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        //创建一个原型对象
        Date date = new Date();
        Sheep sheep1 = new Sheep("喜洋洋",date);
        Sheep sheep2 = (Sheep)sheep1.clone();
        System.out.println("sheep1==>"+sheep1);
        System.out.println("sheep2==>"+sheep2);
        date.setTime(123213);
        //sheep1  克隆出一个 sheep2  克隆羊
        //克隆出来的对象跟原来是一模一样的
        System.out.println("sheep1==>"+sheep1);
        System.out.println("sheep2==>"+sheep2);
    }
}

此时我们可以发现两个对象的值都被更改了 这就是浅克隆的一些弊端

深克隆

我们要实现深克隆有多种方式 可以序列化与反序列化 我们这里直接采用改造克隆方法

代码语言:javascript
复制
    /**
     * 克隆的方法
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        //实现深克隆     或者 序列化与反序列化
        Sheep s=(Sheep)obj;
        //将对象的属性也进行克隆
        s.creatTime = (Date) this.creatTime.clone();
        return obj;
    }

当然此时如果属性较多我们这样做就相形见绌了

但现在只有一个字段 是可以的

测试

我们可以看到只有一个 对象被更改了

完整代码

代码语言:javascript
复制
public class Sheep implements Cloneable{
    /**
     * name名字
     * creatTime 创建时间
     */
    private String name;
    private Date creatTime;

    /**
     * 克隆的方法
     * @return
     * @throws CloneNotSupportedException
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object obj = super.clone();
        //实现深克隆     或者 序列化与反序列化
        Sheep s=(Sheep)obj;
        //将对象的属性也进行克隆
        s.creatTime = (Date) this.creatTime.clone();
        return obj;
    }


    public Sheep() {
    }

    public Sheep(String name, Date creatTime) {
        this.name = name;
        this.creatTime = creatTime;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreatTime() {
        return creatTime;
    }

    public void setCreatTime(Date creatTime) {
        this.creatTime = creatTime;
    }

    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", creatTime=" + creatTime +
                '}';
    }
}
代码语言:javascript
复制
public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        //创建一个原型对象
        Date date = new Date();
        Sheep sheep1 = new Sheep("喜洋洋",date);
        Sheep sheep2 = (Sheep)sheep1.clone();
        System.out.println("sheep1==>"+sheep1);
        System.out.println("sheep2==>"+sheep2);
        date.setTime(123213);
        //sheep1  克隆出一个 sheep2  克隆羊
        System.out.println("sheep1==>"+sheep1);
        System.out.println("sheep2==>"+sheep2);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原型模式
  • 浅克隆
  • 深克隆
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档