23种设计模式之原型模式

23种设计模式之原型模式(Prototype )

创建型设计模式

介绍

意图: 当直接创建重复对象的代价比较大时,采用原型模式(使用拷贝的方式)能够保证性能;

原型设计模式的核心思想就是创建一个对象需要付出很高的代价(例如操作很久的数据库),可以采用对象实现 cloneable 接口的方式,通过 clone 接口,来保证系统的性能。

主要解决:

避免系统内重复对象创建带来的性能损耗;

关键代码:

  1. 实现克隆操作,在JAVA继承Cloneable,重写clone()

优点:

  1. 性能提高(使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone 方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显)
  2. 逃避构造条件的约束

缺点:

  1. 配备克隆方法需要对类的功能进行通盘考虑,这对于已用的类不一定很容易,特别当一个类引用不支持串行化的简介对象,或者引用含有循环结构的时候。(在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆比较麻烦。)
  2. 必须实现Cloneable接口。

使用场景:

1. 对象之间相同或相似,即只是个别的几个属性不同的时候。
  1. 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
  2. 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
  3. 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值

注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。


1. 代码实现

package com.example.demo.test.designMode.prototype;

import lombok.Data;

@Data
public abstract class Shape implements Cloneable {

    private String id;

    private String type;
    
    private ShapeChild shapeChild;

    @Override
    protected Object clone(){
        Object o = null;
        try {
            o = super.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return o;
    }
}

public class ShapeChild  implements Cloneable {
    private String childId;
    
    private String childType;

   	@Override
    protected Object clone(){
        Object o = null;
        try {
            o = super.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return o;
    }
}


总结

原型模式 是一种简单的模式,实现一个接口,重写clone方法即可。对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法,所以,单例模式与原型模式是冲突的。(使用时要特别注意、)
会发生深拷贝的有java中的8种基本类型和他们的封装类型,另外还有string,其余的都是浅拷贝(对象要实现深拷贝,需要对象类同样实现 Cloneable 接口,重写 clone 方法)。

两种克隆方式:

  1. 浅克隆: 被克隆的对象的所有变量都含有与原来的对象相同的值,而它所有对其他对象的引用都任然指向原来的对象。(浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象)
  2. 深克隆: 被克隆对象的所有变量都含有与原来的对象相同的值,但它所有的对其他对象的引用不再是原有的,而这是指向被复制过的新对象。换言之,深复制把要复制的对象的所有引用的对象都复制了一遍,这种叫做间接复制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王叮咚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值