《zhjr08-gof创建型模式-原型模式》由会员分享,可在线阅读,更多相关《zhjr08-gof创建型模式-原型模式(34页珍藏版)》请在金锄头文库上搜索。
1、设计模式授课:张金荣 Email: QQ: (即1211460305) 电话:13983103704第 3 章 GoF-创建型模式GoF-创建型模式第 3 章3.1 Simple Factory Pattern(简单简单 工厂模式)3.2 Factory Method Pattern(工厂方法模式)3.3 Abstract Factory Pattern(抽象工厂模式 )3.4 Builder Pattern(建造者模式)3.5 Prototype Pattern(原型模式)3.6 Singleton Pattern(单单例模式)第 3 章 GoF-创建型模式GoF-创建型模式第 3 章Fa
2、ctory Pattern(工厂模式)Singleton Pattern(单例模式)本章重点 :本章难点:Builder Pattern(建造者模式)Abstract Factory Pattern(抽象工厂模式)第 3 章 GoF-创建型模式3.5 Prototype Pattern(原型模式)v原型模式定义: 用原型实例指定创建对象的种类,并且 通过拷贝这些原型创建新的对象. vPrototype模式允许一个对象再创建另 外一个可定制的对象,根本无需知道任 何如何创建的细节,工作原理是:通过将 一个原型对象传给那个要发动创建的对 象,这个要发动创建的对象通过请求原 型对象拷贝它们自己来实施
3、创建。第 3 章 GoF-创建型模式3.5 Prototype Pattern(原型模式)原型模式的类图第 3 章 GoF-创建型模式3.5 Prototype Pattern(原型模式)第 3 章 GoF-创建型模式3.5 Prototype Pattern(原型模式)v在java的类库中已经实现了这 一模式,只要你定义的类实现 了Cloneable接口,用这个类 所创建的对象可以做为原型对 象进而克隆出更多的同类型的 对象。 第 3 章 GoF-创建型模式v在Java里提到clone技术,就不能 不提java.lang.Cloneable接口和含 有clone方法的Object类。所有具有
4、 clone功能的类都有一个特性,那就 是它直接或间接地实现了Cloneable 接口。否则,我们在尝试调用clone ()方法时,将会触发 CloneNotSupportedException异 常。3.5 Prototype Pattern(原型模式)第 3 章 GoF-创建型模式3.5 Prototype Pattern(原型模式)public interface ProtoTypeextends Cloneable public Object clone(); 下面是实例第 3 章 GoF-创建型模式public class ConcreteProtoType implements P
5、rotoType private String propA; private String propB; public Object clone() try return super.clone(); catch (CloneNotSupportedException e) return null; 3.5 Prototype Pattern(原型模式)public String getPropA() return propA; public void setPropA(String propA) this.propA = propA; public String getPropB() ret
6、urn propB; public void setPropB(String propB) this.propB = propB; 第 3 章 GoF-创建型模式3.5 Prototype Pattern(原型模式)public Object clone() object o=null;try o=super.clone();return o; catch (CloneNotSupportedException e) return null; 第 3 章 GoF-创建型模式 public class ConcreteProtoType implements ProtoType private
7、String propA; private String propB; public ProtoType clone() try return (ProtoType) super.clone(); catch (CloneNotSupportedException e) return null; 3.5 Prototype Pattern(原型模式)/这里重载了Obect#clone()方法,为了方便外 部调用,把返回值由Object修改为ProtoType , 并强制类型转换。* protected - public第 3 章 GoF-创建型模式3.5 Prototype Pattern(原
8、型模式)public class Client public static void testMethod() ConcreteProtoType proto = new ConcreteProtoType(); proto.setPropA(“propA“); proto.setPropB(“propB“); ConcreteProtoType newProto = (ConcreteProtoType) proto.clone(); 。打印newProto和Proto否的值看相等 第 3 章 GoF-创建型模式v以上样例使用浅克隆方式实现 proto type模式,浅克隆无法对 对象中包含
9、的其他非java原是类 型数据进行复制。如果需要复制 其他非java原是类型数据,则需 要使用深克隆方式java实现shadow clone(浅克隆) 与深克隆(deep clone) 第 3 章 GoF-创建型模式v克隆就是复制一个对象的复本.但一个对象中可能有 基本数据类型,如:int,long,float 等,也同时含有非基 本数据类型如(数组,集合等) 被克隆得到的对象基本类型的值修改了,原对象的值 不会改变.这是shadow clone(浅克隆). v但如果你要改变一个非基本类型的值时,原对象的值 却改变了.比如一个数组,内存中只copy他的地址,而 这个地址指向的值并没有copy,
10、当clone时,两个地址 指向了一个值,这样一旦这个值改变了,原来的值当然 也变了,因为他们共用一个值.,这就必须得用深克隆 (deep clone) java实现shadow clone(浅克隆) 与深克隆(deep clone) 第 3 章 GoF-创建型模式v浅克隆只适合克隆基本类型,对于 引用类型就不能实现克隆了 v在Java里深克隆一个对象,常常 可以先使对象实现Serializable接 口,然后把对象(实际上只是对象 的一个拷贝)写到一个流里,再从 流里读回来,便可以重建对象。java实现shadow clone(浅克隆) 与深克隆(deep clone) 第 3 章 GoF-创
11、建型模式vjava.io.ObjectOutputStream代表对象 输出流,它的writeObject(Object obj) 方法可对参数指定的obj对象进行序列化,把 得到的字节序列写到一个目标输出流中。 vjava.io.ObjectInputStream代表对象 输入流,它的readObject()方法从一个源 输入流中读取字节序列,再把它们反序列化 为一个对象,并将其返回。Java的序列化与反序列化第 3 章 GoF-创建型模式v只有实现了Serializable和 Externalizable接口的类的对象 才能被序列化。Externalizable 接口继承自Serializ
12、able接口,实 现Externalizable接口的类完全 由自身来控制序列化的行为,而仅 实现Serializable接口的类可以采 用默认的序列化方式 。Java的序列化与反序列化第 3 章 GoF-创建型模式v对象序列化包括如下步骤: 1) 创建一个对象输出流,它可以包装一个其他类 型的目标输出流,如文件输出流; 2) 通过对象输出流的writeObject()方法写对象 。 v对象反序列化的步骤如下: 1) 创建一个对象输入流,它可以包装一个其他类 型的源输入流,如文件输入流; 2) 通过对象输入流的readObject()方法读取对 象。 Java的序列化与反序列化第 3 章 Go
13、F-创建型模式 vclass Customer implements Serializable private String name; private int age; public Customer(String name, int age) this.name = name; this.age = age; public String toString() return “name=“ + name + “, age=“ + age; Java的序列化与反序列化第 3 章 GoF-创建型模式vimport java.io.*; import java.util.Date; vpublic
14、 class ObjectSaver public static void main(String args) throws Exception ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(“D:“objectFile.obj“) ; v Java的序列化与反序列化第 3 章 GoF-创建型模式/序列化对象Customer customer = new Customer(“ 阿蜜果“, 24);out.writeObject(“你好!“);out.writeObject(new Date();out
15、.writeObject(customer);out.writeInt(123); /写入基本类型数据out.close();Java的序列化与反序列化第 3 章 GoF-创建型模式 v /反序列化对象 v ObjectInputStream in = new ObjectInputStream (new FileInputStream(“D:“objectFile.obj“);System.out.println(“obj1=“ + (String) in.readObject();System.out.println(“obj2=“ + (Date) in.readObject();Customer obj3 = (Customer) in.readObject();System.out.println(“obj3=“ + obj3);int obj4 = in.readInt();System.out.println(“obj4=“ + obj4);in.close();Java的序列化与反序列化第 3 章 GoF-创建型模式vByteArrayOutputStream ot = ne