建造者模式和模板方法模式扩展篇
UML
与抽象工厂模式比较
本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢
- 建造者模式关注的是基本方法的调用顺序,而零件(基本方法)已经准备好
- 抽象工厂关注的零件的生产(基本方法的实现),而组装顺序已经确定
实现
产品抽象
public abstract class Product { public abstract void doSomeThing(); }
产品A
public class AProduct extends Product { @Override public void doSomeThing() { } }
产品B
public class BProduct extends Product { @Override public void doSomeThing() { } }
抽象建造者
public abstract class AbstractBuilder {
private List<String> methodList = new ArrayList(); /** * 建造方法(模板方法) * 按照定制的执行顺序执行方法 * * @return */ protected abstract Product build(); /** * 基本方法 */ protected void methodA(){ } /** * 基本方法 */ protected void methodB(){ } /** * 基本方法 */ protected void methodC(){ } /** * 设置建造的内部逻辑(配置零件) */ public abstract void setPart(); }
建造者实现
public class ABuilder extends AbstractBuilder { private List<String> aList = new ArrayList(); private List<String> bList = new ArrayList(); private List<String> cList = new ArrayList(); private Product product = new AProduct(); @Override protected Product build() { if(CollectionUtils.isEmpty(aList)){ methodA(); } if(CollectionUtils.isEmpty(bList)){ methodA(); } methodC(); // 一些业务逻辑处理 return product; } @Override public void setPart() { //避免引起逻辑错误 aList.clear(); bList.clear(); cList.clear(); aList.add("A1"); aList.add("A2"); aList.add("A3"); bList.add("B2"); } }
建造者实现
public class BBuilder extends AbstractBuilder { private List<String> aList = new ArrayList(); private List<String> bList = new ArrayList(); private List<String> cList = new ArrayList(); private Product product = new BProduct(); @Override protected Product build() { if(CollectionUtils.isEmpty(aList)){ methodA(); } methodC(); if(CollectionUtils.isEmpty(bList)){ methodB(); } // 一些业务逻辑处理 return product; } @Override public void setPart() { //避免引起逻辑错误 aList.clear(); bList.clear(); cList.clear(); bList.add("A1"); bList.add("A2"); bList.add("A3"); cList.add("B2"); } }
导演类,封装实现,避免高层深入具体的建造者接触(可以有多个)
public class Director {
private ABuilder aBuilder = new ABuilder(); private BBuilder bBuilder = new BBuilder(); public Product getAProduct(){ return aBuilder.build(); } public Product getBProduct(){ return bBuilder.build(); } }
调用
public class Client {
public static void main(String[] args) { Director director = new Director(); Product aProduct = director.getAProduct(); aProduct.doSomeThing();