设计模式——原型模式(基于《大话设计模式》)


定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
就像复印一样。将一个原件复印n多份,复印件有原件的全部信息,而且彼此独立。再举个例子,抄作业,虽然是抄,但是该有的态度还是有吧,总不能写一个与xxx同学一样就完事了吧,得把内容也全部誊抄下来吧。
但是全抄一样的吧,老师一眼看出来,就把分扣没了 (想起高中时月考给后桌抄主观题,那哥们一字未改,我俩雷同卷都被判0分) 。所以我们也可以进行一些修改。
在Java中有一个Cloneable的接口,里面没有实际的方法,这是一个指示性接口,说明本类实现了clone方法。
就以抄作业那个为例子进行说明

首先是作业类

class HomeWork implements Cloneable{
    private String text;
    private String name;

    public HomeWork(String text,String name) {
        this.text = text;
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setText(String text) {
        this.text = text;
    }

    public HomeWork clone(){
        try {
            return (HomeWork) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public String toString() {
        return "HomeWork{" +
                "text='" + text + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

测试代码:
总不能名都跟人抄一样吧。

@Test
    public void testY(){
        HomeWork homeWork = new HomeWork("今天天气真好","XXX");
        HomeWork copy = homeWork.clone();
        System.out.println(homeWork);
        copy.setName("YYY");
        System.out.println(copy);
        System.out.println(copy==homeWork);
    }

注意这是个浅复制方法,如果值类型的属性,直接复制不影响,如果是引用类型,复制的是引用而不是将对象复制了一遍。
如果需要简单的深复制,只需要复制那些对象,然后手动赋值即可。
可以看一下ArrayList的clone方法:
就是先复制一个框架,然后再把元素逐一赋值。

public Object clone() {
        try {
            ArrayList<?> v = (ArrayList<?>) super.clone();
            v.elementData = Arrays.copyOf(elementData, size);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }

应用场景…需要复制的场景啊…比如有时候不能将对象发布,但是需要将它的内容发布的时候。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值