设计模式(3)--Prototype 原型模式

来源:互联网 发布:淘宝发货怎么填单号 编辑:程序博客网 时间:2024/06/05 14:14

受spring配置文件bean的属性非单例即prototype的影响,老是不自觉的认为两种模式是对立的。。。事实上,单例的对象确实和原型模式冲突,但是原型模式的重点绝不是单例模式的对立面。

原型模式的重点在于:指定一个类型作为原型,并使用Clone()方法去创建这个类型的对象实例。和工厂模式一样,也是一种创建对象的方式。在实际应用中,原型模式经常是结合工厂等模式出现,比如在factory的实现中使用clone来创造出对象。那么使用clone的理由是什么呢?

  1. clone属于JNI,其性能是new所不能比拟的。其直接复制内存中的二进制数据。
  2. clone可以直接跳过创建对象的复杂过程,比如set一系列的值或者引用对象等等。例如要复制一个map作为不能modify的对象返回,没有clone,你必须new一个map然后循环set每一个键值对,这种写法和速度都是低下的。
    或者说,对象的大部分性质相同,只有特定的一些不同点。比如你复制的一个map大部分都类似,只需要修改一个值,那么clone也会是更好的选择。
  3. 对于运行时才能完全确定内容的对象,比如select一张表得到的结果集,你如何想创建一个完全一样的实例,你不能再去select一次吧,那么就可以使用clone了。
  4. 总之,如果一个类型的对象需要频繁的创建(比如action类,需要存储页面输入状态,不可能是单例的),同时又想免去创建过程的一系列繁琐的步骤,利用clone就是值得考虑的。

所以原型模式的使用和理解相当于对clone的使用和理解,这里不再展开讨论了,以要点方式概括:

  1. clone方法不会调用构造函数。也没有访问权限的约束。
  2. object实现了clone方法但是是protected,所以一般来说需要自己用public的方式重写clone方法。
  3. 对象中的基本类型、封装类型和String,在clone时会实现深复制。而其它的list,map等类型,只是复制了引用而已。一旦将原对象的list改变,复制对象同时会改变。这时候就需要在clone方法中,显式的对这些引用对象进行clone:obj.list = (ArrayList) this.list.clone();
0 0
原创粉丝点击