模式定义
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
模式使用场景
- 类初始化需要消耗非常多的资源,这个资源包括数据,硬件资源等,通过原型拷贝避免这些消耗。
- 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
- 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
UML图
角色描述
* Client: 客户端用户
* Prototype:抽象类或接口,声明具备clone能力
* ConcretePrototype:具体的原型类
实现
文档拷贝为例。
Prototype抽象类为java.lang.clone,ConcretePrototype通过重写该方法完成对象的拷贝功能。
|
|
Client:
|
|
结果:修改clone之后的对象的值不会印象到原来的值。
|
|
深浅拷贝的区别:引用类型拷贝过程中,只拷贝了其引用,并没有将对象进行复制:
|
|
|
|
深拷贝过程中需要将引用类型的字段也要进行拷贝,而不是单纯的拷贝引用:
|
|
优点和缺点
优点:原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是需要在一个循环体中产生大量对象时。
缺点:直接在内存中拷贝,构造方法不会执行,减少了约束,需要注意。