码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-20 16:04:42      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:arraylist   keyword   add   oschina   oid   顺序   业务逻辑   rgs   执行   

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

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

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

标签:arraylist   keyword   add   oschina   oid   顺序   业务逻辑   rgs   执行   

原文地址:https://www.cnblogs.com/dakunqq/p/11707562.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!