前言
原型设计模式系列文章
原型设计模式(一) - 定义、订单拆分
原型设计模式(二) - 订单拆分一般写法实现
原型设计模式(三) - 订单拆分采用原型设计模式进行改进
原型设计模式(四) - 订单拆分采用系统自带的拷贝的方法实现
原型设计模式(五) - 浅拷贝
原型设计模式(六) - 深拷贝
原型设计模式(七) - 使用场景
1. 订单拆分 - 原型设计模式写法
原型设计模式就是:通过拷贝复制出一个新的对象;
实现步骤:
1>:首先定义箱子的接口:IBox,同时在IBox中新增一个 copy()方法;
2>:然后定义具体的出货物品 - 塑料夹子:PlasticClampBox,让它继承IBox,然后复写copy()方法;
3>:然后再定义具体出货的物品 - 汽车的零件:CartPartBox,让它继承IBox,然后复写copy()方法;
4>:然后再定义装箱子的卡车:TruckCar;
5>:然后再定义拆分箱子的类:SplitService;
6>:最后定义客户端测试:Client;
2. 具体代码如下
1>:首先定义箱子的接口:IBox,同时在IBox中新增一个 copy()方法:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:14
* Version 1.0
* Params:
* Description: 出货的箱子
*/
public interface IBox {
/**
* 设置箱子的数量
*/
void setNumber(int number) ;
/**
* 有多少货
*/
int getNumber() ;
/**
* 新增一个方法 - 拷贝
*/
IBox copy() ;
}
2>:然后定义具体出货的物品 - 汽车的零件:CartPartBox,让它继承IBox,然后复写copy()方法:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:17
* Version 1.0
* Params:
* Description: 汽车的零件 - 具体出货的物品
*/
public class CartPartBox implements IBox {
// 汽车个数
private int number ;
// 汽车名称
private String name ;
// 汽车品牌
private String cardBrand ;
@Override
public void setNumber(int number) {
this.number = number ;
}
@Override
public int getNumber() {
return number;
}
@Override
public IBox copy() {
CartPartBox box = new CartPartBox() ;
box.setName(name);
box.setNumber(number);
box.setCardBrand(cardBrand);
return box;
}
public String getCardBrand() {
return cardBrand;
}
public void setCardBrand(String cardBrand) {
this.cardBrand = cardBrand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3>:然后再定义装箱子的卡车:TruckCar:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:23
* Version 1.0
* Params:
* Description: 装箱子的卡车
*/
public class TruckCar {
public IBox box;
/**
* 添加箱子
*/
public void addBox(IBox box){
this.box = box ;
}
/**
* 移除箱子
*/
public IBox removeBox(){
return box ;
}
}
4>:然后再定义拆分箱子的类:SplitService:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 18:42
* Version 1.0
* Params:
* Description: 拆分箱子
*/
public class SplitService {
/**
* 把箱子进行拆分 - 通过 原型设计模式改进,直接调用 IBox的 copy()方法即可
*/
public static List<TruckCar> splitBox(IBox box){
List<TruckCar> carList = new ArrayList<>() ;
while (box.getNumber() > 200){
// 只是在这里调用 IBox的 copy()方法
IBox newBox = box.copy() ;
newBox.setNumber(200);
TruckCar truckCar = new TruckCar() ;
truckCar.addBox(newBox);
carList.add(truckCar) ;
box.setNumber(box.getNumber() - 200);
}
TruckCar truckCar = new TruckCar() ;
truckCar.addBox(box);
carList.add(truckCar) ;
return carList ;
}
}
5>:最后定义客户端测试:Client:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:24
* Version 1.0
* Params:
* Description: 采用原型设计模式 - IBox中写一个 copy()方法
*/
public class Client {
public static void main(String[] args){
CartPartBox box = new CartPartBox() ;
box.setNumber(500);
box.setName("尾灯灯罩");
box.setCardBrand("宝马");
// 接下来,要去拆分
List<TruckCar> carList = SplitService.splitBox(box) ;
for (TruckCar truckCar : carList) {
System.out.println("数量:"+truckCar.removeBox().getNumber());
}
}
}
运行结果与一般写法是一样的:
数量:200
数量:200
数量:100
3. 原型设计模式与一般写法区别
1>:采用原型设计模式,也就是在 IBox中新增的 copy()方法,就只需要在 订单拆分的 SplitService中的 while语句中调用 IBox的 copy()方法就达到了简化代码;
2>:以后如果新增一种对象,就是和CartPartBox、PlasticClampBox评级类似的对象的话,就直接让 该对象继承 IBox,然后复写 copy()方法,然后可以直接在 copy()方法中设置该对象的属性,也就是说让每个这样的类都继承IBox,复写 copy()方法,各自在各自的 copy()方法中 创建自己的对象,然后设置该对象的属性;
3>:这里其实就相当于是把一般写法中 while语句中的if...else...代码分开到每一个对象中的 copy()方法来写的,严格来说并没有怎么简化代码的写法;
那么下一节我们就来看下系统自带的拷贝的方法;