建造者模式(一般):
又叫生成器模式,用于创建包含多个属性的复杂对象,然后返回完整的对象给用户。将一个复杂对象的创建与它的表示分离,使得同样的创建过程可以创建不同的表示,一步一步地创建一个复杂的对象。包含的角色有要创建的复杂对象、具体建造者、抽象建造者和指挥者类。
建造者模式中指挥者类的作用: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();
}
}