前言
通过clone来实例化对象,适用于复杂大对象的创建,一般用不着
UML类图
无
代码示例
java
package com.sw.learn.pattern.B_create.d_prototype;
import java.lang.reflect.Array;
import java.util.*;
import java.util.Scanner;
public class Main {
/**
* 广告主可以在页面上复制已有订单模板,快速创建一个新的订单。
* @param args
*/
public static void main(String[] args) {
// 原始模板
OrderTemplate template = new OrderTemplate(
"爆款推广", 5000, Arrays.asList("二次元", "游戏", "学生")
);
// ✅ 复制新模板
OrderTemplate newTemplate = template.clone();
newTemplate.setTitle("618大促专属投放");
newTemplate.setBudget(10000);
System.out.println("原始模板: " + template);
System.out.println("新建副本: " + newTemplate);
}
}
class OrderTemplate implements Cloneable {
private String title;
private int budget;
private List<String> targetTags;
public OrderTemplate(String title, int budget, List<String> tags) {
this.title = title;
this.budget = budget;
this.targetTags = tags;
}
// ✅ 提供 clone 方法
@Override
public OrderTemplate clone() {
try {
// 深拷贝列表
OrderTemplate copy = (OrderTemplate) super.clone();
copy.targetTags = new ArrayList<>(this.targetTags); // 深拷贝
return copy;
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Clone failed", e);
}
}
@Override
public String toString() {
return "OrderTemplate{" +
"title='" + title + '\'' +
", budget=" + budget +
", targetTags=" + targetTags +
'}';
}
// setter 可用于复制后修改
public void setTitle(String title) { this.title = title; }
public void setBudget(int budget) { this.budget = budget; }
}