生成器模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。也称建造者模式。
目录
前言
生成器模式的主要目标是将对象的创建过程与其表示分离,以便相同的创建过程可以创建不同的表示。将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。这有助于提高系统的灵活性和可重用性。简单来说,去肯德基汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。
一、生成器模式的核心角色
-
抽象生成器(Builder) :这个接口定义了创建对象所需的所有步骤的方法。具体实现类将实现这些方法,以完成对象的构建。
-
具体生成器(Concrete Builder) :这个类实现了抽象生成器的接口,并提供了创建对象的具体实现。它可以逐步构建一个复杂的对象,并在构建过程中保存中间状态。
-
产品(Product) :这是最终要创建的复杂对象。具体生成器会创建这个对象,并在构建过程中逐步添加组成部分。
-
指挥者(Director) :这个类负责控制生成器的构建过程。它知道何时以及如何调用生成器的方法来构建产品。
二、具体实现
1.产品类:套餐
代码如下(示例):
// 产品类:套餐
class MealSet {
private List<String> items = new ArrayList<>();
void addItem(String item) {
items.add(item);
}
void showItems() {
System.out.println("套餐包含以下菜品: " + items);
}
}
2.抽象生成器接口
代码如下(示例):
// 抽象生成器接口
interface MealSetBuilder {
void buildMainCourse();
void buildDessert();
void buildBeverage();
MealSet getResult();
}
3.具体生成器类
为构造的复杂对象设置值。
代码如下(示例):
// 具体生成器类
class ConcreteMealSetBuilder implements MealSetBuilder {
private MealSet mealSet = new MealSet();
@Override
public void buildMainCourse() {
mealSet.addItem("主菜");
}
@Override
public void buildDessert() {
mealSet.addItem("甜点");
}
@Override
public void buildBeverage() {
mealSet.addItem("饮料");
}
@Override
public MealSet getResult() {
return mealSet;
}
}
4.指挥者类
是一个使用生成器类的类
代码如下(示例):
// 指挥者类
class Director {
private MealSetBuilder builder;
public Director(MealSetBuilder builder) {
this.builder = builder;
}
public void construct() {
builder.buildMainCourse();
builder.buildDessert();
builder.buildBeverage();
}
}
5.客户端代码
客户端通过使用指挥者去构造一个新的套餐。
代码如下(示例):
// 客户端代码
public class BuilderPatternDemo {
public static void main(String[] args) {
MealSetBuilder builder = new ConcreteMealSetBuilder();
Director director = new Director(builder);
director.construct();
MealSet mealSet = builder.getResult();
mealSet.showItems(); // 输出:套餐包含以下菜品: [主菜, 甜点, 饮料]
}
}
三、生成器模式的适用性
- 当创建复杂对象的算法应该独立于对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造对象有不同的表现时。
- 生成器模式可以帮助你将对象创建的职责从其他类中分离出来,遵循单一职责原则。
- 如果希望能够在创建对象时有选择性地构建某些部分,而不是每次都创建一个完整对象,生成器模式提供了这种灵活性
四、生成器模式的优缺点
优点:
- 封装性:客户端不需要知道产品内部组成的细节,产品的创建过程与产品本身解耦,这有助于保持客户端代码的简洁性。
- 可扩展性:具体的创建者类可以被扩展,以增加新的构建步骤或改变现有步骤的行为,而不影响其他代码。
- 灵活性:可以更加精细化地控制复杂对象的构建过程,根据生成器提供的步骤逐步构建,允许客户端按需创建不同的产品表示。
缺点:
- 复杂性:如果目标对象的组成部分类似,差异不大,使用生成器模式可能会导致不必要的复杂性,因为需要定义多个构建步骤和对应的生成器类。
- 抽象性:生成器模式通常需要定义一个抽象生成器接口和多个具体生成器类,这增加了系统的抽象层次,可能会使得系统更难理解和维护。
总结
在实际软件工程中,生成器模式适用于那些创建过程复杂、步骤固定且需要灵活控制的产品。在决定是否使用生成器模式时,应当考虑其带来的灵活性和封装性是否值得增加的复杂性。