一、简介
1.1 模式定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属性对象创建型模式。建造者模式又可称为生成器模式。
1.2 适用场景
在以下情况下可以使用建造者模式:
1)需要生成的产品对象由复杂的内部结构,这些产品对象通常包含多个成员属性。
2)需要生成的产品对象的属性相互依赖,需要知道其生成顺序。
3)对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
4)隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
1.3 优点
1)在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
2)每一个具体建造者都相对独立。与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
3)可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
4)增加新的具体建造者无须修改原有类库代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭原则”。
1.4 缺点
1)建造者模式所创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间差异性很大,则不适合建造者模式,因此其使用范围受到一定的限制。
2)如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
二、示例
2.1 结构图
2.2 产品类Meal
public class Meal {
// food和drink是部件
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;
}
}
2.3 抽象建造类MealBuilder
public abstract class MealBuilder {
protected Meal meal = new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal() {
return meal;
}
}
2.4 具体建造者类SubMealBuilderA
public class SubMealBuilderA extends MealBuilder{
@Override
public void buildFood() {
meal.setFood("一个鸡腿堡");
}
@Override
public void buildDrink() {
meal.setDrink("一杯可乐");
}
}
2.5 具体建造者类SubMealBuilderB
public class SubMealBuilderB extends MealBuilder{
@Override
public void buildFood() {
meal.setFood("一个鸡肉卷");
}
@Override
public void buildDrink() {
meal.setDrink("一杯果汁");
}
}
2.6 指挥着类KFCWaiter
public class KFCWaiter {
private MealBuilder mb;
public void setMealBuilder(MealBuilder mb) {
this.mb = mb;
}
public Meal construct() {
mb.buildFood();
mb.buildDrink();
return mb.getMeal();
}
}