四、原型模式
2019-11-17 16:02:10来源:博客园 阅读 ()
四、原型模式
原型模式
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
解释:给定一个原型对象来指明所要创建的对象的类型,然后用拷贝这个原型对象的方法来创建出更多的同类型对象。
Java中原型模式的实现
在JAVA里,通过克隆(Clone())方法来实现原型模式。
任何类,要想支持克隆,必须实现一个接口 Cloneable,该接口中有clone()方法,可以在类中重写自定义的克隆方法。
两种不同的克隆形式:
- 浅拷贝:拷贝出来的对象实例和原型对象是一模一样的。在浅拷贝中,如果原型对象的成员变量基本类型,那么就直接复制,如果是复杂的类型(枚举、对象、数组)就只复制对应的内存地址。无论原型对象还是克隆后的对象,只要是修改了复杂的数据类型,那么两个对象会同时被修改,因为它们共享同一地址值。
- 深拷贝:拷贝出来的对象实例和原型对象也是一模一样的,但是没有任何关联,修改其中一个对象,不影响另一个对象。
浅拷贝
在java中浅拷贝只需要实现Cloneable接口调用Object的clone方法即可
浅拷贝代码实现:
public class Monkey implements Cloneable{
private int age;
private String name;
//省略get、set方法
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
深拷贝
在JAVA怎么做到深度克隆了?通过序列化(Serialization)等方式来进行深度克隆。这个时候要聊一聊什么是序列化了。简单的讲就是序列化就将对象写到流的一个过程,写到流里面去(就是字节流)就等于复制了对象,但是原来的对象并没有动,只是复制将类型通过流的方式进行读取,然后写到另一个内存地址中去。
深拷贝代码实现:
public class Monkey implements Cloneable,Serializable{
private int age;
private Child child;
//省略get、set方法
public Monkey deepCopy() throws Exception{
//将对象写入流中
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
//将对象从流中取出来
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Monkey) ois.readObject();
}
}
原型模式的优缺点
优点
使用原型模型创建一个对象比直接new一个对象更有效率,因为它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
隐藏了制造新实例的复杂性,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
缺点
由于使用原型模式复制对象时不会调用类的构造方法,所以原型模式无法和单例模式组合使用,因为原型类需要将clone方法的作用域修改为public类型,那么单例模式的条件就无法满足了。
使用原型模式时不能有final对象。
Object类的clone方法只会拷贝对象中的基本数据类型,对于数组,引用对象等只能另行拷贝。这里涉及到深拷贝和浅拷贝的概念。
原文链接:https://www.cnblogs.com/lee0527/p/11877488.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 设计模式-委派/策略模式 2020-06-09
- 深入理解:设计模式中的七大设计原则 2020-06-07
- 设计模式---类之间的关系知多少 2020-06-07
- 你与面试官所了解的单例模式并不一样! 2020-06-06
- 高手眼中的观察者模式有什么不一样 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash