定义
原型模式(Prototype):通过已经实例好的对象实例,通过复制的方式 获取 内容相同或者类似的 对象;
特点
- 获取对象不通过直接调用构造方法 的形式获取
- 获取的对象本身就可以包含一些属性
- 可节省资源
优缺点
优点
- 通过深拷贝 获取 一个包含原内容的新对象,简化了对象的创建过程,且少了部分内容的重复赋值
缺点
- 需要为类配置 clone 方法
- clone 方法在 对象内部,修改 逻辑 必须修改类;不符合"开闭原则"
- 深拷贝实现 比较复杂,尤其 多层嵌套的对象 需要每一层都实现深拷贝
主要组成结构
- 抽象原型类:在上层实现了 原型对象的 高层方法或属性
- 具体原型类:具体实现 自己的 clone 方法,是被具体复制 的对象
- 调用者:具体调用具体原型类的clone方法复制对象
应用场景
- 如果有些对象 我们需要大量使用,但是初始状态差不多;我们就可以不使用 构造方法 创建对象;使用原型模式 copy 获取可以节省资源
- 创建对象成本太高(初始化时间较长、占CPU太多)
- 使用频繁,且需要重复赋值的属性值 相同或相似
代码实现
浅拷贝:拷贝出来的新对象,新对象的属性和原对象完全相同,对于非基本类型的属性地址仍然是原对象的属性对象地址,只是 新对象的地址 是新的
深拷贝:拷贝出来的新对象,完全是一个新对象;属性对象地址和此对象地址 都是全新的
浅拷贝
public class PrototypePattern {
public static void main(String[] args) {
final ShallowCloneInstance instance = new ShallowCloneInstance();
instance.setItem("ShallowCloneInstance");
instance.setPerson(new Person());
final ShallowCloneInstance clone = instance.clone();
System.out.println(instance);
System.out.println(clone);
System.out.println(instance.getItem());
System.out.println(instance.getPerson());
System.out.println(clone.getItem());
System.out.println(clone.getPerson());
}
}
/**
* 浅克隆
*/
class ShallowCloneInstance implements Cloneable{
private String item;
private Person person;
public String getItem() {
return item;
}
public Person getPerson() {
return person;
}
public ShallowCloneInstance() {
}
public void setItem(String item) {
this.item = item;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public ShallowCloneInstance clone() {
try {
return (ShallowCloneInstance) super.clone();
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
result
com.beauty.designpatterns.creation.ShallowCloneInstance@5b464ce8
com.beauty.designpatterns.creation.ShallowCloneInstance@57829d67
ShallowCloneInstance
com.beauty.designpatterns.creation.Person@19dfb72a
ShallowCloneInstance
com.beauty.designpatterns.creation.Person@19dfb72a