设计模式-原型模式

/*
* 只有实现标记接口Cloneable才能clone,此时的clone是浅复制,深复制需要重载clone方法
* 且Object是没有实现Cloneable接口的
* */
public interface Product extends Cloneable {

    public abstract void use(String s);

    public abstract Product createClone();

}

Java的深浅复制:https://blog.csdn.net/qq_33061377/article/details/64133251

/*
* 除基本类型,String外其他对象均是浅复制,即只复制对象的引用,需要子类重载clone方法
* */
public class MessageBox implements Product {

    private char decochar;

    public MessageBox(char decochar) {
        this.decochar = decochar;
    }

    @Override
    public void use(String s) {
        int length = s.length();
        for (int i = 0; i < length + 4; i++) {
            System.out.print(decochar);
        }
        System.out.println("");
        System.out.println(decochar + " " + s + " " + decochar);
        for (int i = 0; i < length + 4; i++) {
            System.out.print(decochar);
        }
    }

    @Override
    public Product createClone() {
        Product p = null;
        try {
            p = (Product)clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return p;
    }
}
public class Manager {

    private HashMap<String, Object> showCase = new HashMap<>();

    public void register(String name, Product product) {
        showCase.put(name, product);
    }

    public Product create(String productName) {
        Product p = (Product)showCase.get(productName);
        return p.createClone();
    }

}

深复制需要每个成员都实现clone,然后逐级的复制

public class ManagerTest {

    private Manager manager = new Manager();

    private MessageBox messageBox = new MessageBox('*');

    @org.junit.Test
    public void register() throws Exception {
        manager.register("shixiaodong", messageBox);
    }

    @org.junit.Test
    public void create() throws Exception {
        manager.register("shixiaodong", messageBox);
        Product product = manager.create("shixiaodong");
        product.use("Hello World");
        /*因为实现了clone,两个product是不同的对象,
         *至于内部的属性是否相同,需要看是否实现clone
        */
        System.out.println(product);

    }

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值