將一個複雜對象的構建和它的表示分離,使得一樣的構建過程建立出不一樣的表示。 這句話理解起來優勢抽象,咱們打個簡單的比方吧, 中國人都喜歡作菜,作菜的時候後會放不少配料,放配料的時候須要須要注意時間和前後順序, 不一樣的廚師前後順序不一樣,作出來的菜的口味也就不一樣。 構建的過程就比如作一道菜,方法的執行至關於放配料的動做,最終作出來的菜就比如構建結果,會出現差別。
客戶端使用時不須要知道產品內部複雜的細節過程
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