zoukankan      html  css  js  c++  java
  • 设计模式之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());
      }
    }

  • 相关阅读:
    20145313《信息安全系统设计基础》第0周学习总结
    20145313张雪纯课程总结
    RocEDU.阅读.写作《苏菲的世界》书摘(七)
    RocEDU.阅读.写作《苏菲的世界》书摘(六)
    20145310《信息安全系统设计基础》课程总结
    20145310 《信息安全系统设计基础》第五周同学问题总结
    20145310《信息安全系统设计基础》第十四周学习总结
    20145310《信息安全系统设计基础》第十三周学习总结
    20145310《信息安全系统设计基础》实验五 网络通信
    20145310《信息安全系统设计基础》实验四 外设驱动程序设计
  • 原文地址:https://www.cnblogs.com/code-fun/p/11329744.html
Copyright © 2011-2022 走看看