• 原型模式(Prototype)


    原型模式

    原型模式是为了更方便创建相类似的对象的一种创造型模式,使用原有的对象通过克隆(深或浅)获得新的对象

    使用情况

    在创建新对象成本较大

    一般结构如下:

    Java语言的实现

    浅克隆~

    java语言的所有对象继承自java.lang.Object,在Object类中提供了一个clone方法,可以将一个java对象克隆一份。需要注意的是,能够实现克隆的类必须实现一个标记接口Cloneable,表示该类的对象支持被复制。在没有实现接口的前提下调用clone方法,java编译器会抛出一个CloneNotSupported的异常

    一般而言,java的clone()须满足下面条件

    a.克隆对象与原型对象不是同一个对象

    b.类型一样

    c.equals()方法返回true

    PS:在覆盖的clone()方法必须调用父类的clone()方法(super.clone())

    使用clone()方法只能达到浅克隆的效果,返回的对象之中的引用类型指向的是同一块内存

    深克隆~

    在深克隆中,无论原型对象的成员变量的值还是引用类型,都将复制一份给克隆对象

    在java中,深克隆通过序列化和反序列化实现(序列化Serialization就是将对象写入流的过程),写入流中的对象是原有对象的一个复制品,原有对象依然存在内存中,所以,将写入的对象再从流里面读出来,就可以实现深克隆

    能够实现序列化的对象,其类都必须实现Serializable接口

    假似有一个类A和一个类B,A依赖于B,在需要进行A的深克隆时~~看代码

     1 import java.io.*;
     2 //A and B must implement Serializable
     3 class A implements Serializable{
     4     B b = new B();
     5     public A deepClone throws IOException,ClassNotFountException,OptionalDataException{
     6         ByteArrayOutputStream bao = new ByteArrayOutputStream();
     7         ObjectOutputStream oos = new ObjectOutputStream(bao);
     8         oos.writeObject(this);
     9         ByteArrayInputStream bai = new ByteArrayInputStream();
    10         ObjectInputStream ois = new ObjectOutputStream(bai);
    11         A newA = (A)ois.readObject();
    12         ois.close();
    13         bai.close();
    14         oos.close();
    15         bao.close();
    16         return newA;
    17     }
    18 }
    19 class B implements Serializable{
    20 }
    21 //test
    22 public class Test {
    23     public static void main(String[] args){
    24         boolean test;
    25         A oldA,newA = null;
    26         oldA = new A();
    27         try{
    28             newA = oldA.deepClone();
    29         }catch(Exception e){
    30             System.out.println("Error");
    31         }
    32         test=oldA.b==newA.b?false:true;
    33         System.out.println(test);
    34     }
    35 }
    DeepClone

    原型管理器

    存放多个已存在的对象进行管理,相当于创建对象时使用的模板管理器

    一般原型管理器有一个键值对表,及get set方法,将需要作为模板的对象通过键值对表保存

  • 相关阅读:
    [leetcode ]429. N-ary Tree Level Order Traversale (easy)
    [leetcode] 559. Maximum Depth of N-ary Tree (easy)
    [leetcode] 406. Queue Reconstruction by Height (medium)
    [leetcode] 238. Product of Array Except Self (medium)
    [leetcode] 94. Binary Tree Inorder Traversal
    [leetcode] 621. Task Scheduler(medium)
    [leetcode] 309. Best Time to Buy and Sell Stock with Cooldown(medium)
    为窗口设置图标
    关闭住主窗口
    窗口居中显示
  • 原文地址:https://www.cnblogs.com/toddy-bear/p/3385585.html
Copyright © 2020-2023  润新知