*定义: *用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式主要用于对象的复制,它的核心就是原型类Prototype。Prototype类需要具备以下两个条件:
- 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
- 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口(Cloneable接口),重写一个方法(clone()方法)即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,它的原型类Prototype也常用抽象类来替代。
代码实现
package yang.factorymode.prototype.first;
import java.util.Date;
/*
原型类
步骤:
1.实现一个接口 Cloneable
2.重写一个方法 clone()
*/
public class Video implements Cloneable{
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public Video() {
}
public Video(String name, Date createTime) {
this.name = name;
this.createTime = createTime;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
}
我们知道Object是一切类的父类,代码中的super.clone(),实际上,就是调用Object类中的clone方法,通过查看源码发现,又遇到native方法,说明实现克隆不是通过java实现的,而是调用了C/C++的代码。
package yang.factorymode.prototype.first;
import java.util.Date;
/*
客户端:实现克隆
*/
public class Bilibili {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date();
//原型对象
Video v1 = new