(六)构建型模式-原型模式

itmahy
itmahy
发布于 2024-01-19 / 30 阅读
0
0

(六)构建型模式-原型模式

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

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 方法才行。


评论