建造者模式就是
接口规定了要完成的动作(也就是方法),然后有各个实现类针对这些方法分别进行各自具体的实现。
个人理解其与模板模式最主要的区别就是模板模式会有一个以final定义的方法来规定其必须要完成的动作流程,这个流程不允许被其子类所修改。而建造者模式没有这个约束,只要实现接口规定的方法建即可。
也就是说模板模式隐含一个流程性,而建造者模式没有固定的流程性
下边还是仓库拣货为例简单说明建造者模式
仓库拣货时一般是多张出库单同时拣货,那么一般会根据客户的情况有至少两种拣货任务与拣货列表的生成方式。
一个是合并拣货。所有客户(X,Y,Z)要拣的A品一共3箱4盒,那就可能生成两个拣货列表(一个3箱,一个4盒)和一个拣货任务(a人员去同时拣这两个列表指定的SKU)
另一个是分别拣货,所有客户(X,Y,Z)对要拣的A品可能生成了4个拣货列表(X客户1箱,Y客户1箱,Z客户1箱,Z还有4盒)和2个拣货任务(a人员在整货区拣所有的整箱,b人员在散货区拣散盒)
那么在实际生成时就可以先定义一个统一的接口
package builder;
import java.util.List;
import bean.PickDoc;
import bean.PickList;
import bean.PickTask;
/**
- 定义要完成的动作
- @author mas
-
*/
public interface IPickTask {//计算要拣货的SKU列表
public List<PickList> getPickList(PickDoc doc);//计算拆分的拣货任务
public List<PickTask> getPickList(List<PickList> list);
}
然后分别去做两个针对合并和非合并拣货的生成任务与列表的具体现实
import java.util.ArrayList;
import java.util.List;
import bean.PickDoc;
import bean.PickList;
import bean.PickTask;
/**
- 不合并单据拣货
- @author mas
-
*/
public class SinglePickTask implements IPickTask {@Override
public List<PickList> getPickList(PickDoc doc) {
// TODO Auto-generated method stub
//List<PickList> list = new ArrayList<PickList>();
System.out.println("生成不合并拣单据拣货列表");
return null;
}@Override
public List<PickTask> getPickList(List<PickList> list) {
// TODO Auto-generated method stub
System.out.println("生成不合并拣单据拣货任务列表");
return null;
}
}
package builder;
import java.util.List;
import bean.PickDoc;
import bean.PickList;
import bean.PickTask;
/**
- 合并单据拣货
- @author mas
-
*/
public class UnionPickTask implements IPickTask {@Override
public List<PickList> getPickList(PickDoc doc) {
// TODO Auto-generated method stub
//List<PickList> list = new ArrayList<PickList>();
System.out.println("生成合并拣单据拣货列表");
return null;
}@Override
public List<PickTask> getPickList(List<PickList> list) {
// TODO Auto-generated method stub
System.out.println("生成合并拣单据拣货任务列表");
return null;
}
}
然后进行实际的调用测试
来源:51CTO
作者:mas199980
链接:https://blog.51cto.com/4890631/2484902