设计模式:创建型模式–原型模式(Prototype Pattern)
文章目录
1. 概念
原型模式(Prototype Pattern)通常被用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
2. 组成结构
原型模式包含如下角色:
- 抽象原型类: 规定具体原型对象必须实现的的
clone()
方法。(通常为JDK自带的Cloneable
类,无需我们实现) - 具体原型类: 实现抽象原型类的
clone()
方法,它是可被复制的对象。 - 访问类: 使用具体原型类中的
clone()
方法来复制新的对象。
接口的类图设计如下:
3. 实现细节
原型模式的克隆分为浅克隆和深克隆。
浅克隆(Shallow Clone): 复制对象时仅仅复制对象本身,包括基本属性,但该对象的属性引用其他对象时,该引用对象不会被复制,即拷贝出来的对象与被拷贝出来的对象中的属性引用的对象是同一个。
深克隆(Deep Clone): 复制对象本身的同时,也复制对象包含的引用指向的对象,即修改被克隆对象的任何属性都不会影响到克隆出来的对象。
注意:Java 中的Object
类中提供了 clone()
方法来实现浅克隆。
Cloneable
接口是上面的类图中的抽象原型类,而实现了Cloneable
接口的子实现类就是具体的原型类。
具体实现代码如下:
-
Realizetype(具体的原型类):
/** * @author zzay * @className Realization * @description 创建型模式-原型模式:具体原型类 * @create 2022/02/26 16:43 */ public class Realization implements Cloneable { public Realization() { System.out.println("具体的原型对象创建完成!"); } /** * 实现抽象原型类的`clone()`方法,它是可被复制的对象。 */ @Override protected Realization clone() throws CloneNotSupportedException { System.out.println("具体原型复制成功!"); return (Realization) super.clone(); } }
-
PrototypeTest(测试访问类):
/** * @author zzay * @className PrototypeTest * @description 创建型模式-原型模式:访问类 * @create 2022/02/26 16:44 */ public class PrototypeTest { public static void main(String[] args) throws CloneNotSupportedException { Realization r1 = new Realization(); Realization r2 = r1.clone(); System.out.println("对象r1和r2是同一个对象?&