原型模式的定义与特点
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。
原型模式的结构与实现
由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。
1. 模式的结构
原型模式包含以下主要角色。
抽象原型类:规定了具体原型对象必须实现的接口。
具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
访问类:使用具体原型类中的 clone() 方法来复制新的对象。
UML图
原型模式的两大实现形式,浅克隆和深克隆。对应object.clone()方法中的深浅克隆
浅克隆:只克隆八大基本类型和不变的类型(例如String)。对于引用类型,则只复制其内存地址。也就是说,浅克隆对引用类型而言并没有做到两个对象间的完全解耦。两个对象里面的引用类型实际上引用的是相同的对象。
/** * 浅克隆,只克隆基本常量。对于引用而言。引用的还是同一个对象。并没有完全解耦。 */ public Project clone (){ Project pro = null; try{ pro = (Project) super.clone(); }catch (Exception e){ e.printStackTrace(); } return pro; }
深克隆:引用类型也做了克隆,也就是说引用的是不同的对象。内存地址不同。做法,通过序列化,将引用对象写入流中,并写出到新的内存地址中。自己还没写代码实例hhhhh。
总结:
使用情景:创建对象成本比较大,比如初始化要很长时间的,占用太多CPU的,新对象可以通过复制已有的对象获得的,如果是相似的对象,则可以对其成员变量稍作修改。且很明显看出原型也是一种对象创建模式。