建造者模式

定义

将一个复杂对象的构建和它的表示分离,使得同样的构建过程创建出不同的表示。
这句话理解起来优点抽象,我们打个简单的比方吧,
中国人都喜欢做菜,做菜的时候后会放很多配料,放配料的时候需要需要注意时间和先后顺序,
不同的厨师先后顺序不同,做出来的菜的口味也就不同。
构建的过程就好比做一道菜,方法的执行相当于放配料的动作,最终做出来的菜就好比构建结果,会出现差异。

uml

设计模式-建造者模式-LMLPHP

优点

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

缺点

实现

  • 抽象创建者
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());

	}
}

扩展

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

10-17 02:37