❤ 作者主页:李奕赫揍小邰的博客
❀ 个人介绍:大家好,我是李奕赫!( ̄▽ ̄)~*
🍊 记得点赞、收藏、评论⭐️⭐️⭐️
📣 认真学习!!!🎉🎉
原型模型简介
原型模型:是指基于一个已经给定的对象,通过拷贝的方式,创建一个新的对象,这个给定对象,就是“原型”。在 Java 中,原型模式体现为 Object 的 clone() 方法。所有类都可以通过实现 Cloneable 接口,以及重写 clone() 方法,来实现原型模式。
Object 的 clone() 方法
clone浅拷贝:
public class Library implements Cloneable {
private String id;
private String name;
private String category;
@Override
public Library clone() throws CloneNotSupportedException {
return (Liability) super.clone();
}
}
clone深拷贝
public class PolicyDeepClone implements Cloneable {
private String code;
private int applicantAge;
private Liability liability;
private List<String> specialDescriptions;
@Override
public PolicyDeepClone clone() throws CloneNotSupportedException {
PolicyDeepClone clone = (PolicyDeepClone) super.clone();
clone.specialDescriptions = new ArrayList<>(this.specialDescriptions);
clone.liability = this.liability.clone();
return clone;
}
}
clone()方法sonar测试报错
当我们实现了 clone() 方法,在编译器中,还会看到一条 Blocker 级别的 Sonar 警告:Remove this “clone” implementation; use a copy constructor or copy factory instead.它推荐的是一个拷贝构造器和拷贝工厂。
拷贝构造器
浅拷贝
public final class PolicyCopyConstructor {
private String code;
private int applicantAge;
private Liability liability;
private List<String> specialDescriptions;
public PolicyCopyConstructor(PolicyCopyConstructor policy) {
this.code = policy.code;
this.applicantAge = policy.applicantAge;
this.liability = policy.liability;
this.specialDescriptions = policy.specialDescriptions;
}
}
拷贝工厂
浅拷贝
public final class PolicyCopyFactory {
private String code;
private int applicantAge;
private Liability liability;
private List<String> specialDescriptions;
public static PolicyCopyFactory newInstance(PolicyCopyFactory policy) {
PolicyCopyFactory copyPolicy = new PolicyCopyFactory();
copyPolicy.setCode(policy.getCode());
copyPolicy.setApplicantAge(policy.getApplicantAge());
copyPolicy.setLiability(policy.getLiability());
copyPolicy.setSpecialDescriptions(policy.getSpecialDescriptions());
return copyPolicy;
}
}
对比
- List item不依赖于某一种带有风险的,语言之外的对象创建机制(clone 是 native 方法)。
- 不会与 final 域的正常使用发生冲突(clone 架构与引用可变对象的 final 域的正常使用是不兼容的)。
- 不会抛出受检异常。
- 不需要类型转换。