原型模式(Prototype)

落花浮王杯 提交于 2020-03-12 05:28:23

原型模式

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

使用情况

在创建新对象成本较大

一般结构如下:

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方法,将需要作为模板的对象通过键值对表保存

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!