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();
	}
}


  

 

 

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