原型模式
定义
- 通过new创建对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
- 就是Java中的克隆技术,以某个对象为原型,复制出新的对象。
- 优势:效率高,避免重新执行构建过程。
- 克隆类似于new,但不同于new。new创建新的对象属性采用默认值。克隆出的对象属性完全与原型对象相同,并且克隆出的新对象改变不会影响原型对象,然后再修改克隆对象的值。
核心
- Clonable接口的clone()方法。
- 实现原型模式最困难的是内存复制操作,所幸Java提供了clone()方法。
应用场景
-
原型模式很少单独使用,一般与工厂模式一起出现。通过clone()方法创建对象后由工厂模式返回。
-
Spring的Bean创建有单例模式和原型模式两种方式。
代码
public class Video implements Cloneable {
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
Object clone = super.clone();
//实现深克隆
Video video = (Video) clone;
//将这个对象的属性也进行克隆
video.createTime = (Date) video.createTime.clone();
return clone;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", 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;
}
public Video() {
}
public Video(String name, Date createTime) {
this.name = name;
this.createTime = createTime;
}
}
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
//原型对象
Date date = new Date();
Video video1 = new Video("三国演义", date);
System.out.println(video1);
System.out.println(video1.hashCode());
//克隆对象
Video video2 = (Video) video1.clone();
System.out.println(video2);
System.out.println(video2.hashCode());
}
}