前言
原型设计模式系列文章
原型设计模式(一) - 定义、订单拆分
原型设计模式(二) - 订单拆分一般写法实现
原型设计模式(三) - 订单拆分采用原型设计模式进行改进
原型设计模式(四) - 订单拆分采用系统自带的拷贝的方法实现
原型设计模式(五) - 浅拷贝
原型设计模式(六) - 深拷贝
原型设计模式(七) - 使用场景
1. 订单拆分 - 一般写法
实现步骤:
1>:首先定义箱子的接口:IBox;
2>:然后定义具体的出货物品 - 塑料夹子:PlasticClampBox;
3>:然后再定义具体出货的物品 - 汽车的零件:CartPartBox;
4>:然后再定义装箱子的卡车:TruckCar;
5>:然后再定义拆分箱子的类:SplitService;
6>:最后定义客户端测试:Client;
2. 订单拆分原理图解如下
2. 具体代码如下
1>:首先定义箱子的接口:IBox:
/**
* 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() ;
}
2>:然后定义具体的出货物品 - 塑料夹子:PlasticClampBox:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:17
* Version 1.0
* Params:
* Description: 具体出货的物品 - 塑料夹子
*/
public class PlasticClampBox implements IBox {
// 塑料架子名称
private String name ;
// 塑料夹子数量
private int number ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void setNumber(int number) {
this.number = number ;
}
@Override
public int getNumber() {
return number;
}
}
3>:然后再定义具体出货的物品 - 汽车的零件:CartPartBox:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:17
* Version 1.0
* Params:
* Description: 具体出货的物品 - 汽车的零件
*/
public class CartPartBox implements IBox {
// 汽车零件名称
private String name ;
// 汽车零件数量
private int number ;
// 汽车零件品牌
private String cardBrand ;
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;
}
@Override
public void setNumber(int number) {
this.number = number ;
}
@Override
public int getNumber() {
return number;
}
}
4>:然后再定义装箱子的卡车: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 ;
}
}
5>:然后再定义拆分箱子的类:SplitService:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 18:42
* Version 1.0
* Params:
* Description: 拆分箱子
*/
public class SplitService {
/**
* 把箱子进行拆分
* 这样子写是有问题的,就是代码有点多,而且不便于扩展,比如我要新增一种货箱(尾盖),还需要在下边添加if...else...
* 导致代码冗余
*/
public static List<TruckCar> splitBox(IBox box){
// 用于存储所有车的集合
List<TruckCar> carList = new ArrayList<>() ;
// 如果大于200,就进行拆分
while (box.getNumber() > 200){
// 如果箱子是塑料夹子箱子
if (box instanceof PlasticClampBox){
// 把箱子强转为塑料夹子箱子
PlasticClampBox orderBox = (PlasticClampBox) box;
// 每辆车的箱子
PlasticClampBox newBox = new PlasticClampBox() ;
newBox.setName(orderBox.getName());
newBox.setNumber(200);
// 创建卡车对象,然后把新的箱子装到车上,并把车放入list集合
TruckCar truckCar = new TruckCar() ;
truckCar.addBox(newBox);
carList.add(truckCar) ;
box.setNumber(box.getNumber() - 200);
// 如果箱子是汽车零件箱子
}else if (box instanceof CartPartBox){
// 创建汽车零件箱子
CartPartBox orderBox = (CartPartBox) box;
// 每辆车的箱子
CartPartBox newBox = new CartPartBox() ;
newBox.setName(orderBox.getName());
newBox.setNumber(200);
newBox.setCardBrand(orderBox.getCardBrand());
// 创建卡车对象,然后把汽车零件装到车上,并把车放入list集合
TruckCar truckCar = new TruckCar() ;
truckCar.addBox(newBox);
carList.add(truckCar) ;
box.setNumber(box.getNumber() - 200);
}
/*else if (){
}*/
}
// 如果不大于200,就直接把箱子装上车
TruckCar truckCar = new TruckCar() ;
truckCar.addBox(box);
carList.add(truckCar) ;
return carList ;
}
}
6>:最后定义客户端测试:Client:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:24
* Version 1.0
* Params:
* Description: 测试客户端 - 最一般写法
*/
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>:代码有点多,而且不便于扩展:
比如我要新增一种货箱(尾盖),还需要在 SplitService的 While语句下边不断添加if...else...,导致代码冗余;
2>:同时也违背了最少知识原则;
基于这样的缺点,那么我们下一节就来使用 原型设计模式来对它进行修改。