建造者模式和模板方法模式扩展篇

建造者模式和模板方法模式扩展篇

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();

猜你喜欢

转载自www.cnblogs.com/dakunqq/p/11707562.html
今日推荐