背景
假如刘德华点了一杯奶茶,你也要跟他一样的奶茶?你该怎么做?
首先是奶茶类的定义:
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