对象创建型模式~原型模式
preknowledge:
1 值类型 & 引用类型 ~ 内存四区
值类型:int float double
引用类型:string 实例对象
内存四区:OP将内存划分为四个区域:代码段,全局变量区,栈,堆 ~ 不同的内存管理
全局变量区:static的方法放在全局变量区,该方法是属于类的方法
栈:存放的变量具有生命周期,其中保存的数值由操作系统管理,只可压进栈基本的有确定长度单位的~值类型
堆:存放长度单位不确定的~引用类型
2 浅克隆 & 深克隆
浅克隆:只复制了栈区所指向堆区的地址,堆区的数据没有复制,所以复制出的与原对象指向同一个饮用类型的变量
只考虑所复制的对象,而不考虑其所引用的成员对象
java中Object类提供的clone()方法
深克隆:复制代码,引用类型,值类型
引用其他对象的变量将指向被复制过的新对象
3 Java中的Stream
java利用Stream简化了输入输出的过程:
OutputStream:输出到外部(磁盘,内存缓存区...)
InputStream:输入到程序的内部(可以从文件,网络接口,内存缓存区...中输入)
过程:
定义输入流(定义来源,属于结点流)~定义处理流1(对输入数据进行的操作1)~处理流2 ...~ 定义输出流(定位输出的位置,属于结点流)
注意:需要由结点流开始,结点流结束
java中的序列化:方便对象在计算机间的传递 ~ java中该过程需要用到Stream
~ A计算机对二进制代码进行复制,B计算机再对该二进制代码进行还原
~ 类支持该功能使用:serializable标识接口(该接口为空,作用为使jdk提前知道并作准备)
~ 深克隆中:实例化后的实例需要被序列化
具体例:
1 import java.io.*; 2 3 public class Email implements Serializable 4 { 5 private Attachment attachment = null; 6 public Email () 7 { 8 this.attachment = new Attachment(); 9 } 10 11 public Object deepClone () throws IOException,ClassNotFoundException,OptionalDataExecption 12 { 13 //将对象写入流中 14 ByteArrayOutputStream bao = new ByteArrayOutputStream();//字节数组输出流标明数据的来源地(文本流:文本形式;字节流:直接操作二进制) 15 ObjectOutputStream oos = new ObjectOutputStream(bao);//处理流:序列化为一个Object,转化为Object,bao:输出位置结点流处理完给其保存 16 oos.writeObject(this); //this:从缓存区中还原出一个新的对象,Email自身实例把当前实例对象序列完再写入到结点bao中 17 18 //将对象从流中取出 19 ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());//缓存区按字节数组形式读取出 20 ObjectInputStream bis = new ObjectInputStream(bis); //处理流 21 return(bis.readObject()); //反序列化,返回对象 22 } 23 24 public Attachment getAttachment() 25 { 26 return this.attachment; 27 } 28 29 public void display(){ 30 System.out.println(“read the Email”); 31 } 32 }
模式动机:
复制对象自身,从而克隆出多个与原型对象一样的对象
模式定义:
用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象
模式角色:
抽象原型类:定义具有自己的方法的接口
具体原型类:实现具体克隆的方法,在克隆方法中返回自己的一个克隆对象
客户类:让一个原型克隆自身从而创建一个新的对象
模型优点:
提高新实例效率
可以动态增加减少产品类
提供简化的创建结构
可以使用深克隆保存对象的状态(ps)
模型缺点:
对已有的类进行改造时违背了开闭原则
实现深克隆较复杂(内存的分配,内存的释放)
模式适用:
创建新对象成本较大
对象的状态变化小