設計模式-建造者模式

建造者模式

定義

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

相關文章
相關標籤/搜索