java23种设计模式—原型模式

xiaoxiao2021-02-28  31

原型模式也属于创建型模式。简言之,就是如何复制一个对象的设计模式。创建对象的方式有很多种,对java而言,可以在JVM堆中new一个,也可以通过反射、序列化,又或者相应的对象工厂也可以代劳。我们关注的点是,创建对象的开销。当创建一个对象的消耗比较大的时候,使用原型模式可以很高效的创建对象。在java中顶层对象Object提供了clone()方法,只要我们正确的实现Cloneable接口的clone()方法,就可以实现对象的克隆。

原型类

/** * Created by tiantian on 2018/7/3. */ public class Prototype implements Cloneable{ String property = "property"; List<String> list = new ArrayList<>(); public Prototype() { list.add("hello"); } public void printProperty() { System.out.println(property); } public void setProperty(String p) { this.property = p; } public void addToList(String s) { this.list.add(s); } public void setList(List list) { this.list = list; } public void printList() { System.out.println(this.list.toString()); } @Override public Prototype clone() throws CloneNotSupportedException { return (Prototype) super.clone(); } }

客户端测试类

/** * Created by tiantian on 2018/6/18. */ public class Client { public static void main(String[] args) throws CloneNotSupportedException { Prototype prototype = new Prototype(); Prototype prototype2 = prototype.clone(); prototype2.list.add("word"); System.out.println(prototype.list.toString()); System.out.println(prototype2.list.toString()); } }控制台打印结果: [hello, word]

[hello, word]

我们以prototype对象为原型克隆出了相似对象prototype2,然后为prototype2对象的list集合添加了"word"元素。然而意想不到的是控制台打印出prototype的list集合竟然也包含"word"元素。原来这就是传说中java的浅克隆,或者也叫浅复制。prototype2对象的属性list所引用的对象和prototype对象的list引用了同一个ArrayList对象。所以prototype2对list的操作会引起prototype对象发生改变。我们当然不希望这样对事情发生。想改变也很容易,谁让java还有深度复制这一说法呢。只要改变clone()方法的实现为以下就可以。

@Override public Prototype clone() throws CloneNotSupportedException { String property = this.property; List<String> list = new ArrayList<>(this.list); Prototype copy = new Prototype(); copy.setProperty(property); copy.setList(list); return copy; }

clone()方法中手动地用new创建了一个ArrayList对象,再次出现了我们希望的结果:

[hehe] [hehe, word]

很显然,深度复制并不适合组合了太多其他对象的对象。使用clone()方法克隆对象时会绕过对象的构造方法,而直接在内存中复制该对象,所以对一些初始化较为复杂的对象使用克隆的方式可以很高效的创建同等对象。

更多设计模式原创文章:

原型模式

单例模式

建造者模式

工厂模式

策略模式

转载请注明原文地址: https://www.6miu.com/read-2626259.html

最新回复(0)