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

Posted dakunqq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建造者模式和模板方法模式扩展篇相关的知识,希望对你有一定的参考价值。

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

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

以上是关于建造者模式和模板方法模式扩展篇的主要内容,如果未能解决你的问题,请参考以下文章

建造者模式

建造者模式

设计模式-建造者模式JAVA实现

2-建造者模式

设计模式总结篇系列:建造者模式(Builder)

Java设计模式之建造者模式