原型模式
创建型的模式。通过原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象。原型模式用于创建重复的对象,同时又能保证性能,且多用于创建复杂的或者构造耗时的实例,可使程序运行更高效。
这种模式实现了 Cloneable 接口,用于创建当前对象的克隆。
传统方式克隆
优点 | 好理解,简单易操作 |
---|---|
缺点 | 1、创建对象时,总需要重新获取原始对象的属性,如果创建的对象比较复杂,效率低下; 2、总需要重新初始化对象,而不是动态的获取对象运行时的状态,不够灵活 |
原型模式
其实就是一种拷贝机制,分为浅拷贝和深拷贝两种机制
浅拷贝
Object 类提供的方法 clone 只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝叫做浅拷贝。即两个对象共享一个私有变量,修改时两个对象的内容都会改变。
深拷贝
则需对私有的类变量进行独立的拷贝。拷贝的对象与原生对象指向的内存地址不同
/**
* 1、实现一个接口 Cloneable
* 2、重写一个方法
*/
public class Person implements Cloneable{
private String name;
private Date createTime;
/* @Override
protected Object clone() throws CloneNotSupportedException {
//浅拷贝
return super.clone();
}
*/
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
//实现深拷贝
Person person = (Person) obj;
video.createTime = (Date) this.createTime.clone(); //将这个对象的属性也进行克隆
return person;
}
public Person() {
}
public Person(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 "Person{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
}
使用场景
1、类初始化需消耗非常多的资源
2、通过 new 一个对象非常繁杂的数据准备或访问权限
3、当对象需提供给其它对象访问,且各个调用者可能都需修改其值,可考虑原型模式拷贝多个对象供调用者使用。
Tips:
原型模式很少单独出现,一般与工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。