JAVA创建型模式 -- 需要克隆,不如看看原型模式

一、引言

  每天多学一点点 ~

  坚持就是最快得成功 ~

二、什么是原型模式

   原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。

 

三、应用场景

  • 对象之间相同或相似,即只是个别的几个属性不同的时候。
  • 对象的创建过程比较麻烦,但复制比较简单的时候。

四、优缺点

优点

  • Java 自带的原型模式性能更优
  • 可以使用深克隆的方式保存对象状态,可辅助实现撤销操作

缺点

  • 需要为每一个类都配置一个clone方法
  • clone方法位于类的内部,违背了开闭原则
  • 深克隆时逻辑较为复杂

五、浅克隆

   定义:创建一个新对象,新对象的属性和原对象完全相同,对于非基本类型属性,仍指向原有属性所指向的地址 。

代码实现:

/**
 * @Author WangYan
 * @Date 2022/8/21 22:25
 * @Version 1.0
 * 视频类
 *
 *  浅拷贝
 * 实现克隆步骤:
 *    1.实现一个接口  Cloneable
 *    2.重写一个方法 clone()
 */
@AllArgsConstructor
@Data
public class Video implements Cloneable {

    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

/**
 * @Author WangYan
 * @Date 2022/8/21 22:35
 * @Version 1.0
 * 测试克隆  浅拷贝
 */
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Date date = new Date();
        Video v1 = new Video("bibil", date);
        // 克隆对象
        Video v2 = (Video) v1.clone();

        System.out.println("v1 : " + v1);
        System.out.println("v2 : " + v2);

        System.out.println("===============================");

        date.setTime(41421414);
        System.out.println("v1 : " + v1);
        System.out.println("v2 : " + v2);
    }
}

运行结果: 

   由此可以看出v1和v2对象得属性createTime时间都改变了,证明出v1和v2的对象的date指向得是同一个地址.

六、深克隆

 

定义:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原来的地址 

代码实现:

深克隆:  只需要改变 clone() 方法.

/**
 * @Author WangYan
 * @Date 2022/8/21 22:25
 * @Version 1.0
 * 视频类
 *
 * 深克隆: 只需要改变 clone() 方法
 */
@AllArgsConstructor
@Data
public class Video implements Cloneable {

    private String name;
    private Date createTime;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Video video = (Video) super.clone();

        // 克隆属性
        video.createTime = (Date) this.createTime.clone();

        return video;
    }
}

 

结果:

    由此看出,只有v1对象得createTime属性改变了,证明出v1和v2的对象的date指向得不是同一个地址

总结:

   浅克隆和深克隆对于非基本数据类型属性,指向得地址值不同。浅克隆指向原有的属性地址值,深克隆则是创建一个新的,指向新的属性地址值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸航不吃瓜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值