Java 中的生成器(Builder)是一种创建复杂对象的设计模式,它允许您使用相同的构造代码来生成不同的对象,同时允许您在创建对象时设置其属性。这种模式在创建大型对象时非常有用,例如在构建复杂的 GUI 界面或配置大型系统时。
Java 生成器模式的核心思想是将对象构建分解为一系列步骤,每个步骤都可以设置一个或多个属性。这些步骤被封装在生成器类中,以使对象构建过程可重用,并且可以在不同的场景中进行扩展和定制化。最终,生成器类将返回一个构建好的对象,该对象包含所有设置的属性。
下面是一个简单的 Java 生成器模式示例,用于构建一个餐厅订单。该示例使用了链式调用(Fluent API)来设置订单中的属性。
public class RestaurantOrder {
private String mainDish;
private String sideDish;
private String drink;
private String dessert;
private boolean hasDelivery;
private RestaurantOrder() {}
public String getMainDish() {
return mainDish;
}
public String getSideDish() {
return sideDish;
}
public String getDrink() {
return drink;
}
public String getDessert() {
return dessert;
}
public boolean isHasDelivery() {
return hasDelivery;
}
public static class Builder {
private String mainDish;
private String sideDish;
private String drink;
private String dessert;
private boolean hasDelivery;
public Builder withMainDish(String mainDish) {
this.mainDish = mainDish;
return this;
}
public Builder withSideDish(String sideDish) {
this.sideDish = sideDish;
return this;
}
public Builder withDrink(String drink) {
this.drink = drink;
return this;
}
public Builder withDessert(String dessert) {
this.dessert = dessert;
return this;
}
public Builder withDelivery(boolean hasDelivery) {
this.hasDelivery = hasDelivery;
return this;
}
public RestaurantOrder build() {
RestaurantOrder order = new RestaurantOrder();
order.mainDish = this.mainDish;
order.sideDish = this.sideDish;
order.drink = this.drink;
order.dessert = this.dessert;
order.hasDelivery = this.hasDelivery;
return order;
}
}
}
在上述代码中,我们首先定义了一个 RestaurantOrder 类,该类包含了订单中的各个属性。然后,我们定义了一个 Builder 类,该类包含了一系列方法,用于设置订单的属性。每个方法都返回 Builder 实例本身,以允许链式调用。最后,我们在 Builder 类中定义了一个 build 方法,该方法将使用 Builder 中的属性来构建一个 RestaurantOrder 对象,并返回该对象。
下面是一个使用示例:
RestaurantOrder order = new RestaurantOrder.Builder()
.withMainDish("Spaghetti Carbonara")
.withSideDish("Garlic Bread")
.withDrink("Coke")
.withDessert("Tiramisu")
.withDelivery(true)
.build();
System.out.println("Main Dish: " + order.getMainDish());
System.out.println("Side Dish: " + order.getSideDish());
System.out.println("Drink: " + order.getDrink());
System.out.println("Dessert: " + order.getDessert());
System.out.println("Delivery: " + order.isHasDelivery());
在上面的示例中,我们使用 Builder 类来构建一个 RestaurantOrder 对象,并设置其属性。然后,我们使用该对象的 getter 方法来获取其属性,并将其打印到控制台上。