原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。
以某个对象为原型进行克隆再进行加工修改。
创建复杂对象时,提高效率。
优点:
- 性能提高。
- 逃避构造函数的约束。
缺点:
- 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
使用场景:
- 类初始化非常复杂,需要大量资源。
- 一个对象多个修改者的场景。
- 原型模式很少单独使用,一般是和工厂模式一起使用,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。clone替代了new。
实例:Spring 框架中 Bean 的创建,使用了单例模式、原型模式。
实现步骤
- 实现 Cloneable 接口
- 重写 clone() 方法
浅拷贝or深拷贝
浅拷贝中属性中引用对象为同一个。
深拷贝时,将应用对象也进行克隆。
代码
Video.java
public class Video implements Cloneable {
private String name;
private Date creatTime;
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
// 深克隆
Video v = (Video) obj;
// 将对象属性进行克隆
v.creatTime = (Date) this.creatTime.clone();
return obj;
}
// get&set方法略
}
Copy.java
public class Copy {
public static void main(String[] args) throws CloneNotSupportedException {
// 原型对象 v1
Date date = new Date();
Video v1 = new Video("java", date);
Video v2 = (Video) v1.clone();
System.out.println("v1=>" + v1);
System.out.println("v2=>" + v2);
System.out.println("===================================================");
date.setTime(9999);
System.out.println("v1=>" + v1);
System.out.println("v2=>" + v2);
}
}
结果如下图: