• 设计模式之GOF23原型模式01


    原型模式prototype

    原型模式:

    - 通过new产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式,比如如果new对象所需时间过长,可以通过克隆产生相同的副本

    - Java中的克隆技术,就是以某个对象为原型,复制出新的对象,显然新的对象剧本原型对象的特点

    - 克隆类似new但是并不相同,new出的对象都是默认值,克隆出来的对象的属性值与原型对象相同。浅复制时,复制出的对象的属性如果是引用的类型,则指向同一地址;深复制时,    复制出的对象的属性与原型对象属性的引用不应指向同一地址,这就保证了修改原型或副本属性值时,不会影响另一对象

    - 优势:效率高(直接克隆,避免了重新执行构造过程步骤)

    原型模式实现步骤:

    - Clongable接口(空接口)与重写clone方法

    - 深复制时需要调用属性引用对象的clone方法

    /**原型模式(浅克隆)
     * 属性中的引用对象不进行复制(指向同一块内存)
     * @author 小帆敲代码
     *
     */
    public class Sheep implements Cloneable{
      private String name;
      private Date birthday;
      
      @Override
      protected Object clone() throws CloneNotSupportedException {
      return super.clone();
      }
      public String getName() {
       return name;
      }
      public void setName(String name) {
       this.name = name;
      }
      public Date getBirthday() {
       return birthday;
      }
      public void setBirthday(Date birthday) {
       this.birthday = birthday;
      }
      public Sheep(String name, Date birthday) {
       this.name = name;
       this.birthday = birthday;
      }
      public Sheep() {
      }
    }

    /**
     * 深复制(deep clone)
     * @author 小帆敲代码
     *
     */
    public class SheepDeep implements Cloneable {
     private String name;
     private Date birthday;
     
     @Override
     protected Object clone() throws CloneNotSupportedException {
      Object obj=super.clone();
      SheepDeep sd=(SheepDeep)obj;
      Date d=(Date) sd.getBirthday().clone();//属性也克隆一份
      sd.setBirthday(d);
     return sd;
     }
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public Date getBirthday() {
      return birthday;
     }
     public void setBirthday(Date birthday) {
      this.birthday = birthday;
     }
     public SheepDeep(String name, Date birthday) {
      this.name = name;
      this.birthday = birthday;
     }
     public SheepDeep() {
    }
    }

    客户端

    public class Client {
      public static void main(String[] args) throws Exception {
       Date d=new Date(132328888L);
       Sheep s1=new Sheep("多利",d);
       System.out.println(s1);
       System.out.println(s1.getBirthday());
       
       Sheep s2=(Sheep) s1.clone();
       System.out.println(s2);
       System.out.println(s2.getBirthday());
       //测试浅复制,复制的不是值而是引用对象的地址

    //注意顺序
       Sheep s3=(Sheep) s1.clone();
       d.setTime(47388989L);
       System.out.println(s3);
       System.out.println(s3.getBirthday());
      }
    }

  • 相关阅读:
    ES6笔记(二):对象简写
    python通过protobuf实现rpc
    Python之mmap内存映射模块(大文本处理)说明
    python 基于Avro实现RPC
    python 使用 thrift 教程
    软光栅(BlinnPhong 模型,无贴图)(Python)
    递归绘制贝塞尔曲线
    计算机网络核心概览
    BlinnPhong 光照模型 Demo (Python)
    博客园图片批量自动上传
  • 原文地址:https://www.cnblogs.com/code-fun/p/11329744.html
Copyright © 2020-2023  润新知