原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Java 中,Object 的 clone() 方法就属于原型模式。
/**
* @Author: mahy
* @Contact: [email protected]
* @Date: 2022-03-07 15:32
* @Description: 在这儿描述
*/
public class MilkTea {
public String type;
public boolean ice;
public MilkTea clone(){
MilkTea milkTea = new MilkTea();
milkTea.type = this.type;
milkTea.ice = this.ice;
return milkTea;
}
@Override
public String toString() {
return "MilkTea{" +
"type='" + type + '\'' +
", ice=" + ice +
'}';
}
}
/**
* @Author: mahy
* @Contact: [email protected]
* @Date: 2022-03-07 14:02
* @Description: 在这儿描述
*/
public class Test001 {
public static void main(String[] args) {
MilkTea tea = new MilkTea();
tea.type = "麦香";
tea.ice= false;
MilkTea clone = tea.clone();
MilkTea clone1 = tea.clone();
MilkTea clone2 = tea.clone();
System.out.println(clone); //MilkTea{type='麦香', ice=false}
System.out.println(clone1); //MilkTea{type='麦香', ice=false}
System.out.println(clone2); //MilkTea{type='麦香', ice=false}
}
}
这就是原型模式,Java 中有一个语法糖,让我们并不需要手写 clone 方法。这个语法糖就是 Cloneable
接口,我们只要让需要拷贝的类实现此接口即可。
/**
* @Author: mahy
* @Contact: [email protected]
* @Date: 2022-03-07 15:32
* @Description: 在这儿描述
*/
public class MilkTea implements Cloneable{
public String type;
public boolean ice;
@NotNull
@Override
public MilkTea clone() throws CloneNotSupportedException {
return (MilkTea) super.clone();
}
@Override
public String toString() {
return "MilkTea{" +
"type='" + type + '\'' +
", ice=" + ice +
'}';
}
}
调用结果一样。
值得注意的是,Java 自带的 clone 方法是浅拷贝的。也就是说调用此对象的 clone 方法,只有基本类型的参数会被拷贝一份,非基本类型的对象不会被拷贝一份,而是继续使用传递引用的方式。如果需要实现深拷贝,必须要自己手动修改 clone 方法才行。