原始模型模式:
<o:p> 参考书籍:阎老师的<<java与模式>></o:p>
<o:p>网络文章:追mme与java的23个模式
</o:p>
定义:通过一个原始模型的对象来指明索要创建的类型 然后用复制这个原始类型的方法创造出更多的同类型的对象
<o:p> </o:p>
个人理解:
我觉的要理解原始模型模式 首先 有两个概念要搞清楚:
第一 对象引用
第二 复制
---------------------------------------------我是分割线-----------------------------------------1:对象引用
对象引用:主要是指对象在堆栈里面的互相引用 其实并没有占用多余的内存空间 只是在栈空间了多少设置了一个引用
EX:
A a = new A();
A b = a ;
这样的过程 实际就是 第一步: 在堆里面创建了一个对象A 同时在栈里面创建了引用a
第二步:在栈里面创建一个引用b 指向了生成的a的实例
所以如果b对象里面的属性改变了 那a对象里面的属性也就跟着改变了
在java里面没有指针的概念 但是有句柄的概念 如果传递了一个句柄 实际就是传递了这个对象的引用。
所以如果你建的类 里面存在循环调用 如果实例化的话 就会把栈空间消耗完
java.lang.StackOverflowError
---------------------------------------------我是分割线-----------------------------------------
2:复制
复制
l 应该是相对于引用来说的
l 复制包括 浅复制 和深复制
---------------------------------------------我是分割线-----------------------------------------浅复制:
浅复制在java中的实现就是object 的clone()方法
Java里面所有的类都继承了object类
如果这个要想能够复制 还必须实现 cloneable接口(里面什么也没有 但是如果不实现这个接口的话 使用object.clone()方法的时候 就会抛出cloneNotSupportException的异常)
现在假设 A实现了cloneable接口
EX:
A a = new A();
A b = a.clone();
第一步 在内存里面创建一个a 对象
第二步 复制一个a对象 传递给b
这个时候 a 里面的基本类型和b的基本类型是一样的 但是存放在不同的内存地址上
所以 此时修改a的基本属性以后 b的基本属性是不会变化的 这就是复制
由 浅复制 顾名思义 就是复制的很基本 复杂的基本类型就不复制了
所以如果A类里面有比较复杂的人为创建的对象的话 浅复制 还是只是建立一个引用没有复制具体的内容
---------------------------------------------我是分割线-----------------------------------------
深复制:
相对于浅复制来说的 :他能够避免掉浅复制不能完全复制复杂对象的缺点
在java中实现深复制是使用serializable 接口
EX:
A a = new A();
ByteArrayOutputStream bos = new ByteArrayOutputStream();<o:p></o:p>
ObjectOutputStream oos = new ObjectOutputStream(bos);<o:p></o:p>
oos.writeObject(obj);<o:p></o:p>
ByteArrayInputStream ois = new ByteArrayInputStream(bos.toByteArray());
A b = (A)ois.readObject();
<o:p> </o:p>
因为在流传输的过程中已经和jvm 脱离了 所以复制的东西全部都以 流的形式出去了 脱离了jvm 当重新再被读近来的时候 就是一个新的对象了。
这里的所有都是要在内存里面重新实例化的 所以就是深复制
<o:p> ---------------------------------------------我是分割线-----------------------------------------</o:p>
引用:
4、PROTOTYPE―跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)
原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。<o:p></o:p>
<o:p> </o:p> ---------------------------------------------我是分割线-----------------------------------------
在这里面作者把情话作为一个要复制的对象,感觉上面和原始模型模式有些勉强。<o:p></o:p>
Mm最近倒霉 手机丢了 为了不让他们家里人发现 mm要求你给他买一个一模一样的手机来蒙横家里人 <o:p></o:p>
如果你有 mm 手机的原始模型你复制一个就可以 如果没有 就花点银子到商店里面去买一个 这时候对应得手机的类就是一个原始模型类 需要手机的时候 生产线装配一部就可以了