建造者模式(一般):
又叫生成器模式,用於創建包含多個屬性的複雜對象,然後返回完整的對象給用戶。將一個複雜對象的創建與它的表示分離,使得同樣的創建過程可以創建不同的表示,一步一步地創建一個複雜的對象。包含的角色有要創建的複雜對象、具體建造者、抽象建造者和指揮者類。
建造者模式中指揮者類的作用: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();
}
}