本模式能够看出与抽象工厂很是相似,都是产生不一样的产品,怎么区分这两种设计的使用场景呢 - 建造者模式关注的是基本方法的调用顺序,而零件(基本方法)已经准备好 - 抽象工厂关注的零件的生产(基本方法的实现),而组装顺序已经肯定
产品抽象ide
public abstract class Product { public abstract void doSomeThing(); }
产品Aui
public class AProduct extends Product { @Override public void doSomeThing() { } }
产品B设计
public class BProduct extends Product { @Override public void doSomeThing() { } }
抽象建造者code
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(); }
建造者实现blog
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"); } }
建造者实现get
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(); } }
调用io
public class Client { public static void main(String[] args) { Director director = new Director(); Product aProduct = director.getAProduct(); aProduct.doSomeThing(); } }