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