设计模式 - 【构建型】【原型模式】

背景

假如刘德华点了一杯奶茶,你也要跟他一样的奶茶?你该怎么做?
首先是奶茶类的定义:

public class MilkTea {
    public String type;
    public boolean ice;
}

然后是下单函数:

public class User_01 {
    private void build(){
        MilkTea liudehua_milk = new MilkTea();
        liudehua_milk.type = "草莓味";
        liudehua_milk.ice = false;

        //此时普通会怎么做?
        MilkTea your_milk = new MilkTea();
        // 这样只是有两份引用指向同一份对象,还是一杯奶茶,那么我们怎么搞出两杯奶茶?
        your_milk = liudehua_milk;

    }
}

这样是不行的吧,我们得到的还是一杯奶茶

public class User_02 {
    private void build(){
        MilkTea liudehua_milk = new MilkTea();
        liudehua_milk.type = "草莓味";
        liudehua_milk.ice = false;

        MilkTea your_milk = new MilkTea();
        your_milk.type = "草莓味";
        your_milk.ice = false;

        // 这样手动new 会导致大量重复的劳动,假如更改需求
        // 现在要加冰了,你就需要改变全部的对象
        // 所以这样也不行

    }
}

这样倒是得到了两杯奶茶,但是需要写大量的代码,假如刘德华改变了口味或者其他的东西,那么我们就需要重新改变其他人的代码。

那么更改奶茶类的定义,运用下原型模式,,其实就是把new 对象的过程封装一下

public class MilkTea_01 {

    public String type;
    public boolean ice;

    //开始用原型模式
    public MilkTea_01 clone(){
        MilkTea_01 your_milk = new MilkTea_01();
        your_milk.type = this.type;
        your_milk.ice = this.ice;
        return your_milk;
    }
}

然后是我们的订单类:

public class User_03 {
    public void order() {
        MilkTea_01 liudehua_milk = new MilkTea_01();
        liudehua_milk.type = "草莓味";
        liudehua_milk.ice = true;

        //开始调用原型模式
        MilkTea_01 your_milder = liudehua_milk.clone();
    }
}

这样的话我们就可以直接调用clone()方法来new 对象
需要更改原来的对象的话,比较方便。

Java 里面已经封装好了Clone 方法,我们只需要实现这个接口就好了
我们需要注意的就是这个是浅克隆,不是深克隆,对于引用的复制,还只是停留在改变引用。这样我们就需要更改clone 方法

public class MilkTea_02 implements Cloneable {
    public String type;
    public boolean ice;

    @Override
    public MilkTea_02 clone() throws CloneNotSupportedException {
        return (MilkTea_02) super.clone();
    }
}

参考: https://mp.weixin.qq.com/s/QWM079Z_zoU_2WxsMxw48g

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值