GoF設計模式-建造者模式

建造者模式(一般):

    又叫生成器模式,用於創建包含多個屬性的複雜對象,然後返回完整的對象給用戶。將一個複雜對象的創建與它的表示分離,使得同樣的創建過程可以創建不同的表示,一步一步地創建一個複雜的對象。包含的角色有要創建的複雜對象、具體建造者、抽象建造者和指揮者類。
    建造者模式中指揮者類的作用:1.隔離了用戶與對象創建過程 2.負責控制對象創建的過程,如對象中屬性賦值的順序

建造者的使用環境:

    1.對象具有多個複雜的屬性
    2.對象的屬性之間相互依賴,需要制定屬性的賦值順序
    3.對象的創建過程(指揮者類)獨立於創建該對象的類(具體建造者)
    4.將對象的創建和表示分離,使得相同的創建過程可以創建不同的對象
    
建造者模式的優點:

    1.用戶不需要知道對象創建和對象組成的細節,將對象與對象創建工程分離,使得相同的創建過程可以創建不同的對象
    2.增加新的具體建造者無須修改原有代碼,具有較好的靈活性和可擴展性,符合開閉原則,用戶根據不同的具體建造者得到不同的對象
    3.可以控制對象的創建過程

建造者模式的缺點:

    1.建造者模式創建的對象具有較多的共同點,組成部分相似,如果對象之間的差異很大,則無法使用建造者模式
    2.如果對象內部變換複雜,可能會需要很多具體建造者,系統變得龐大複雜

建造者模式的例子:以KFC套餐爲例

要創建的複雜對象

public class Meal {
	private String food;
	private String drink;

	public String getFood() {
		return food;
	}
	
	public void setFood(String food) {
		this.food = food;
	}
	
	public String getDrink() {
		return drink;
	}
	
	public void setDrink(String drink) {
		this.drink = drink;
	}
	
}

抽象建造者

public abstract class MealBuilder {
	
	protected Meal meal = new Meal();
	
	public abstract void buildFood();
	public abstract void buildDrink();
	
	public Meal getMeal() {
		return meal;
	}
}


    兩個不同的具體建造者

public class MealBuilderA extends MealBuilder{

	 /**
	 * @Description: TODO
	 * @author doudou
	 * @date 2019年10月8日
	 * @throws
	 * @return
	 * @see creation.BuilderPattern.MealBuilder#buildFood()
	*/
	@Override
	public void buildFood() {
		meal.setFood("一個雞腿堡");
	}

	 /**
	 * @Description: TODO
	 * @author doudou
	 * @date 2019年10月8日
	 * @throws
	 * @return
	 * @see creation.BuilderPattern.MealBuilder#buildDrink()
	*/
	@Override
	public void buildDrink() {
		meal.setDrink("一杯可樂");
	}

}

public class MealBuilderB extends MealBuilder{

	 /**
	 * @Description: TODO
	 * @author doudou
	 * @date 2019年10月8日
	 * @throws
	 * @return
	 * @see creation.BuilderPattern.MealBuilder#buildFood()
	*/
	@Override
	public void buildFood() {
		meal.setFood("一個肌肉卷");	
	}

	 /**
	 * @Description: TODO
	 * @author doudou
	 * @date 2019年10月8日
	 * @throws
	 * @return
	 * @see creation.BuilderPattern.MealBuilder#buildDrink()
	*/
	@Override
	public void buildDrink() {
		meal.setDrink("一杯蘋果汁");
	}

}

指揮者類

public class KFCWaiter {
	private MealBuilder mealBuilder;

	/**
	 * @param mealBuilder the mealBuilder to set
	 */
	public void setMealBuilder(MealBuilder mealBuilder) {
		this.mealBuilder = mealBuilder;
	}
	
	public Meal constructMeal() {
		mealBuilder.buildFood();
		mealBuilder.buildDrink();
		return mealBuilder.getMeal();
	}
}


  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章