设计模式
建造者模式
基本介绍
建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。
主要解决
在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。
优点
- 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
- 可以更好地控制构建过程,隐藏具体构建细节。
- 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。
缺点
- 如果产品的属性较少,建造者模式可能会导致代码冗余。
- 增加了系统的类和对象数量。
注意事项
刚开始的时候不明白和工厂模式有啥区别。工厂模式就相当于是流水线,制作方式,步骤都是一样的,但是创建者模式可能会自由的掌控步骤以得到不同的表现。
具体案例
现在有一个订单类
package builder;
import java.sql.Time;
//一个订单类
public class Order {
private String orderId;
private String customerName;
private double totalPrice;
private String deliveryTime;//发货时间
// 可以添加更多属性,如订单日期、订单状态等
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public double getTotalPrice() {
return totalPrice;
}
public void setTotalPrice(double totalPrice) {
this.totalPrice = totalPrice;
}
public String getDeliveryTime() {
return deliveryTime;
}
public void setDeliveryTime(String deliveryTime) {
this.deliveryTime = deliveryTime;
}
}
手机订单类
package builder;
public class PhoneOrder extends Order {
}
开始制造手机订单,一个有发货时间,一个没有发货时间
普通方法
package builder;
import java.sql.Time;
public class createOrder {
public static void main(String[] args) {
}
public PhoneOrder createOrder1() {
PhoneOrder order = new PhoneOrder();
//手机id生成过程可能需要大量代码,此处用“手机001”直接代替
order.setOrderId("手机001");
order.setCustomerName("手机");
//手机订单的价格可能也需要通过大量的计算
order.setTotalPrice(2000);
order.setDeliveryTime("2024-07-23");
return order;
}
//发货时间未知,则需要再写一遍
public PhoneOrder createOrder2() {
PhoneOrder order = new PhoneOrder();
//手机id生成过程可能需要大量代码,此处用“手机001”直接代替
order.setOrderId("手机001");
order.setCustomerName("手机");
//手机订单的价格可能也需要通过大量的计算
order.setTotalPrice(2000);
return order;
}
}
结论
订单类就是由多个属性组成,其中属性的生成方法都是相同的,但是属性与属性之间的组合可以不同,就生成了不同形式的订单(已发货订单和未发货订单)。这种写法直接明了,想生成什么订单就直接创建,但是当属性的生成过程和组合情况非常复杂时,代码就看起来很冗余,并且扩展性不高。
建造者模式
第一步:定一个建造者接口,包括生成订单的方法
package builder.improve;
import java.sql.Time;
public interface OrderBuilder {
public void setOrderId(String orderId);
public void setCustomerName(String customerName);
public void setOrderPrice(double orderPrice);
public void setOrderDescription(String orderDescription);
public Order buildOrder();
}
第二步:具体的手机订单建造者方法
package builder.improve;
import builder.PhoneOrder;
import java.sql.Time;
public class PhoneOrderBuilder implements OrderBuilder {
Order order = new Order();
@Override
public void setOrderId(String orderId) {
order.setOrderId("orderId");
}
@Override
public void setCustomerName(String customerName) {
order.setCustomerName(customerName);
}
@Override
public void setOrderPrice(double orderPrice) {
order.setTotalPrice(orderPrice);
}
@Override
public void setOrderDescription(String orderDescription) {
order.setDeliveryTime(orderDescription);
}
@Override
public Order buildOrder() {
return order;
}
}
手机订单建造者需要实现每个属性具体的实现过程
第三步:创建一个指导者,指导订单的创建流程
package builder.improve;
public class Director {
OrderBuilder orderBuilder = null;
public Director(OrderBuilder orderBuilder) {
this.orderBuilder = orderBuilder;
}
public OrderBuilder createOrder1() {
orderBuilder.setOrderId("001");
orderBuilder.setCustomerName("手机");
orderBuilder.setOrderPrice(2000);
orderBuilder.setOrderDescription("2024-07-23");
orderBuilder.buildOrder();
return orderBuilder;
}
public OrderBuilder createOrder2() {
orderBuilder.setOrderId("001");
orderBuilder.setCustomerName("手机");
orderBuilder.setOrderPrice(2000);
orderBuilder.buildOrder();
return orderBuilder;
}
}
指导者不用关心每个属性具体的实现内容,只需要控制顺序就行。
第四步:调用指导者创建订单
package builder.improve;
public class createOrder {
public static void main(String[] args) {
OrderBuilder orderBuilder = new PhoneOrderBuilder();
Director director = new Director(orderBuilder);
OrderBuilder order1 = director.createOrder1();
OrderBuilder order2 = director.createOrder2();
}
}
结论
使用建造者模式,指导者可以任意组合创建者的属性生成方法,从而得到不同形式的订单。这里的订单属性太少且生成方式过于简单,属性越多且生成方式越复杂,建造者模式的优势才能更明显。