在构建一个在线订餐平台时,我们需要处理各种不同的订单项,包括不同类型的菜品、饮料以及可能的特别要求。订单构建过程需要灵活地适应不同的定制选项。
2. 为什么要使用建造者模式
建造者模式允许用户通过一系列步骤来定制订单,同时保持代码的清晰和组织性。这使得添加新的订单项或定制选项变得更加容易。
3. 标准建造者模式图
4. 业务建造者模式图
5. 业务代码参考
java
// 订单项接口
interface OrderItem {
void prepare();
}
// 具体订单项实现
class Meal implements OrderItem {
private String dishType;
private int quantity;
private List<String> toppings;
// Constructor, getters and setters
public void prepare() {
// 准备餐点逻辑
}
}
class Beverage implements OrderItem {
private String drinkType;
private String size;
private boolean ice;
// Constructor, getters and setters
public void prepare() {
// 准备饮料逻辑
}
}
// 订单建造者
class OrderBuilder {
private List<OrderItem> orderItems = new ArrayList<>();
private String deliveryTime;
public OrderBuilder addOrderItem(OrderItem item) {
orderItems.add(item);
return this;
}
public OrderBuilder setDeliveryTime(String time) {
this.deliveryTime = time;
return this;
}
public Order build() {
Order order = new Order();
order.setOrderItems(orderItems);
order.setDeliveryTime(deliveryTime);
return order;
}
}
// 订单类
class Order {
private List<OrderItem> orderItems;
private String deliveryTime;
// Constructor, getters and setters
// 准备订单中的所有项
public void prepareOrder() {
for (OrderItem item : orderItems) {
item.prepare();
}
}
}
// 客户端使用建造者模式构建订单
public class OrderSystem {
public static void main(String[] args) {
Order order = new OrderBuilder()
.addOrderItem(new MealBuilder()
.setDishType("牛肉面")
.setQuantity(2)
.addTopping("香菜")
.build())
.addOrderItem(new BeverageBuilder()
.setDrinkType("可乐")
.setSize("大杯")
.addIce(true)
.build())
.setDeliveryTime("12:00")
.build();
order.prepareOrder();
}
}
6. 使用建造者模式的好处
建造者模式将订单的构建过程封装起来,使得构建复杂对象(如包含多个订单项的订单)变得更加灵活和易于管理。它的好处包括:
- 灵活性:可以很容易地添加新的订单项或定制选项。
- 解耦:客户端代码不需要知道订单项的具体构建细节。
- 可维护性:集中管理订单的构建逻辑,便于维护和扩展。
7. 其他使用建造者模式场景参考
建造者模式适用于需要构建具有多个可选配置的复杂对象的任何场景,例如:
- 用户配置文件:允许用户设置不同的偏好设置。
- 复杂的查询构建器:在数据库操作中构建复杂的查询。
8. 可参考开源框架
- Apache Commons Builder:提供了一系列方便的建造者类,用于创建复杂对象。
总结
建造者模式为构建复杂对象提供了一种清晰和灵活的方法,使得代码易于理解和维护,同时支持对象构建过程的扩展。