zoukankan      html  css  js  c++  java
  • 5 原型模式(Prototype)

    原型模式是创建型的模式,思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。在Java中,复制对象是通过clone()实现的,先创建一个原型类

     
    1. /**
       * 原型类
       * 
       * @author liubo
       */
      public class Prototype implements Cloneable {
          @Override
          protected Object clone() throws CloneNotSupportedException {
              Prototype proto = (Prototype) super.clone();
              return proto;
          }
      }
    一个原型类,只需要实现Cloneable接口,覆写clone方法,此处clone方法可以改成任意的名称,因为Cloneable接口是个空接口,你可以任意定义实现类的方法名,如cloneA或者cloneB,因为此处的重点是super.clone()这句话,super.clone()调用的是Object的clone()方法,而在Object类中,clone()是native的
     

    浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

    深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。


    1. /**
       * 完整的原型模式,浅复制,深复制
       */
      package com.liubo.patterns.prototype;
      import java.io.ByteArrayInputStream;
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.io.Serializable;
      /**
       * 原型类
       * 
       * @author liubo
       */
      public class Prototype implements Cloneable, Serializable {
          private String string;
          private SerializableObject obj;
          /* 浅复制 */
          @Override
          protected Object clone() throws CloneNotSupportedException {
              Prototype proto = (Prototype) super.clone();
              return proto;
          }
          /* 深复制 */
          public Object deepClone() throws IOException, ClassNotFoundException {
              /* 写入当前对象的二进制流 */
              ByteArrayOutputStream bos = new ByteArrayOutputStream();
              ObjectOutputStream oos = new ObjectOutputStream(bos);
              oos.writeObject(this);
              /* 读出二进制流产生的新对象 */
              ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
              ObjectInputStream ois = new ObjectInputStream(bis);
              return ois.readObject();
          }
          public String getString() {
              return string;
          }
          public void setString(String string) {
              this.string = string;
          }
          public SerializableObject getObj() {
              return obj;
          }
          public void setObj(SerializableObject obj) {
              this.obj = obj;
          }
          class SerializableObject implements Serializable {
              private static final long serialVersionUID = 1L;
          }
      }

    要实现深复制,需要采用流的形式读入当前对象的二进制输入,再写出二进制数据对应的对象。





  • 相关阅读:
    172. Factorial Trailing Zeroes
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    91. Decode Ways
    LeetCode 328 奇偶链表
    LeetCode 72 编辑距离
    LeetCode 226 翻转二叉树
    LeetCode 79单词搜索
    LeetCode 198 打家劫舍
    LeetCode 504 七进制数
  • 原文地址:https://www.cnblogs.com/liubo6/p/4517182.html
Copyright © 2011-2022 走看看