设计模式(三)——原型模式
今天主要说说原型模式prototype,原型模式最基本的理解就是复制一份对象实例,它也是一种创建型模式。一般情况是我们新建一个原型对象类,然后对该对象进行复制,重新修饰中就可以当作新对象使用了。这在处理比较复杂的对象时是非常高效的,因为使用的是已经存在实例化的对象。
一般采用原型模式的原型对象都需要实现Cloneable接口,实现方式就是使用clone()方法。
/** * 原型模式——浅复制 * @author xiAoT * */ public class Prototype implements Cloneable { @Override protected Object clone() throws CloneNotSupportedException { return (Prototype)super.clone(); } }
上面就是一种原型模式的浅复制。原型模式一般分为深复制和浅复制。
浅复制就是指复制一个对象时,如果对象的成员变量是基本数据类型,则复制一份该成员变量到新对象中;如果对象的成员变量是引用数据类型,则该成员变量不复制,而是新对象中该成员变量和旧对象的该成员变量指向同一个引用。
深复制与浅复制的主要区别在于,如果成员变量是引用数据类型,此时深复制也会复制一份该成员变量到新对象中,而不是指向旧的引用。
要进行深复制,就不是只重写clone方法这么简单,需要将原对象以二进制流的方式输入,然后再写出该二进制数据对应的对象。
/** * 原型模式——深复制;因为采用二进制流的方式,所以需要序列化 * @author xiAoT * */ public class Prototype2 implements Cloneable, Serializable { private String str; private User user;//序列化的对象 public String getStr() { return str; } public void setStr(String str) { this.str = str; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } /** * 浅复制 */ public Object clone(){ try { return (Prototype2)super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 深复制 * @return */ public Object deepClone() throws Exception{ ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(this); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } }
何时使用原型模式呢?如果你创建复杂的或者耗时的对象时,可以使用原型模式,在这种情况下,复制一份存在实例回事程序运行更搞笑。
相关推荐
zhongshish 2020-10-21
jinfeng0 2020-08-03
uileader 2020-07-18
jameszgw 2020-06-21
yanglin 2020-05-02
钟鼎 2020-05-01
嵌入式移动开发 2020-04-10
THEEYE 2020-03-26
嵌入式移动开发 2020-01-23
gougouzhang 2020-01-12
TingBen 2019-12-29
chvnetcom 2020-01-06
Mrwind 2019-11-03
chvnetcom 2019-10-29
baohuanlove 2019-08-16
nongshuqiner 2015-07-27
anqier 2019-07-01
titans 2017-06-03
THEEYE 2016-12-22