设计模式-建造者模式

建造者模式

定义

将一个复杂对象的构建和它的表示分离,使得一样的构建过程建立出不一样的表示。
这句话理解起来优势抽象,咱们打个简单的比方吧,
中国人都喜欢作菜,作菜的时候后会放不少配料,放配料的时候须要须要注意时间和前后顺序,
不一样的厨师前后顺序不一样,作出来的菜的口味也就不一样。
构建的过程就比如作一道菜,方法的执行至关于放配料的动做,最终作出来的菜就比如构建结果,会出现差别。
uml

优势

  • 封装性
客户端使用时不须要知道产品内部复杂的细节过程

缺点

实现

  • 抽象建立者
public abstract class AbstractChef {

	private  LinkedList<String> methodList = new LinkedList();

	protected abstract void addChili(Food food);

	protected abstract void addPepper(Food food);

	protected abstract void addSugar(Food food);

	protected abstract Food cook();

	public LinkedList<String> getMethodList() {
		return methodList;
	}

	public void setMethodList(LinkedList<String> methodList) {
		this.methodList = methodList;
	}
}
  • 建立者的实现
public class SpicyFoodChef extends AbstractChef {


	@Override
	protected void addChili(Food food) {
		food.setSpicyWeight(10);
		System.out.println("+辣椒");
	}

	@Override
	protected void addPepper(Food food) {
		System.out.println("+麻椒");
	}

	@Override
	protected void addSugar(Food food) {
		System.out.println("+糖");
	}

	@Override
	protected Food cook() {
		SpicyFood spicyFood = new SpicyFood();
		super.getMethodList().stream().forEach(method ->{
			if("addChili".equals(method)){
				this.addChili(spicyFood);
			}
			if("addPepper".equals(method)){
				this.addPepper(spicyFood);
			}
			if("addSugar".equals(method)){
				this.addSugar(spicyFood);
			}
		});

		return spicyFood;
	}
  • 产品抽象
public abstract class Food {

	private Integer spicyWeight;

	public Integer getSpicyWeight() {
		return spicyWeight;
	}

	public void setSpicyWeight(Integer spicyWeight) {
		this.spicyWeight = spicyWeight;
	}
}
  • 具体的产品
public class SpicyFood extends Food {


	@Override
	public void setSpicyWeight(Integer spicyWeight) {
		if(spicyWeight > 20){
			System.out.println("辣度不容许超过20,不然客户不接受");
			return;
		}
		super.setSpicyWeight(spicyWeight);
	}
}
  • 调用者
public class Client {

	public static void main(String[] args) {
		AbstractChef abstractChef = new SpicyFoodChef();
		System.out.println("我要吃微辣的");

		abstractChef.getMethodList().add("addChili");
		Food food = abstractChef.cook();
		System.out.println("菜的辣度" + food.getSpicyWeight());

	}
}

应用场景

  • 相同的方法,不一样的执行顺序,产生不一样的事件结果时
  • 多个部件或零件,均可以装配到一个对象中,可是产生的运行结果又不相同时
  • 产品类很是复杂,或者产品类中的调用顺序不一样产生了不一样的效能

总结来讲就组装的原料或者组装顺序以及组装的位置不一样会产生不同的产品ide

扩展

建造者模式的定义范围单纯的根据客户的需求定义单类产品的定制化需求,就比如鸡蛋灌饼,有的客户须要加鸡蛋,有的则还须要加火腿,然而实际状况是多是小店里面不但作鸡蛋灌饼还作手抓饼,又不一样的人负责,也能够加鸡蛋或者火腿,鸡蛋灌饼也许还能加土豆丝等,单纯的建造者模式不能知足当前需求了,可是能够结合模板方法一块儿使用增长扩展,下一节会结合使用this

相关文章
相关标签/搜索