【设计模式05】原型模式

前言

通过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; }
}