zoukankan      html  css  js  c++  java
  • 创建模式

      在开发过程中,有时会遇到为一个类创建多个实例的情况,这些实例内部成员往往完全相同或有细微的差异,而且实例的创建开销比较大或者需要输入较多参数,如果能通过复制一个已创建的对象实例来重复创建多个相同的对象,这就可以大大减少创建对象的开销,这个时候就需要原型模式。

      原型模式简单来说,就是使需要具有拷贝功能的类实现Cloneable接口并重写clone()方法即可。它可以通过一个对象实例确定创建对象的种类,并且通过拷贝创建新的实例。总的来说,原型模式实际上就是从一个对象创建另一个新的对象,使新的对象可以具有原对象的特征。

      好处:

        (1)封装成员变量细节:将对一个对象中各个字段的复制操作封装在了clone()方法中,这样,使用该类的用户就不需要对对象中的各个字段的细节进行了解,直接调用clone()方法就可以实现对象的拷贝

        (2)控制成员变量权限:通过clone()方法还可以为不同的字段设置被复制的权限,从而允许仅对可以被复制的字段进行复制。

      原型模式是一种应用及其广泛的设计模式,Clone也是一种十分常见的操作,以至于在Java中,终极父类Object将Clone方法作为了所有类应具有的基本功能,并且Java也提供了Cloneable接口。

      既然是拷贝对象,那么自然会涉及到 浅拷贝 与 深拷贝。

      首先需要明确 引用拷贝 和 对象拷贝 的概念。引用拷贝,创建一个指向对象的引用变量的拷贝。对象拷贝,创建对象本身的一个副本。浅拷贝 和 深拷贝 都是对象拷贝。

      浅拷贝:

        被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象

      深拷贝:

        深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

        实现深拷贝一般有三种方式:一种方式是手动为每个字段创建新的对象;第二种可以利用序列化和反序列化的方式实现深拷贝;第三种就是用Json来做转换。这几种方式各有优劣:

          - 手动赋值的方式相对其他两种方式在速度上有绝对的优势,但是会有大量的对象属性赋值代码,特别是如果属性中含有引用类型或其他复杂自定义的属性,使用手动赋值会很困难
          - 使用序列化的方式速度最慢,而且待拷贝的对象的类必须实现Serializable接口
          - 使用json的方式速度较快,但无法应用于有自定义类型的属性的对象

  • 相关阅读:
    备忘录
    中缀表达式转为后缀表达式
    未出现的最小正整数
    摩尔投票算法
    两个等长升序序列找中位数
    Morris二叉树遍历
    2020牛客寒假算法基础集训营5 街机争霸
    2020牛客寒假算法基础集训营5 牛牛战队的比赛地
    2020牛客寒假算法基础集训营2 求函数
    2020牛客寒假算法基础集训营2 建通道
  • 原文地址:https://www.cnblogs.com/43726581Gavin/p/9043903.html
Copyright © 2011-2022 走看看