原型模式
原型模式是为了更方便创建相类似的对象的一种创造型模式,使用原有的对象通过克隆(深或浅)获得新的对象
使用情况
在创建新对象成本较大
一般结构如下:
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 }
原型管理器
存放多个已存在的对象进行管理,相当于创建对象时使用的模板管理器
一般原型管理器有一个键值对表,及get set方法,将需要作为模板的对象通过键值对表保存