设计模式——建造者模式

设计模式

建造者模式

基本介绍

建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建具有不同表示形式的对象。

主要解决

在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但组合的算法相对稳定。

优点

  • 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
  • 可以更好地控制构建过程,隐藏具体构建细节。
  • 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。

缺点

  • 如果产品的属性较少,建造者模式可能会导致代码冗余。
  • 增加了系统的类和对象数量。

注意事项

刚开始的时候不明白和工厂模式有啥区别。工厂模式就相当于是流水线,制作方式,步骤都是一样的,但是创建者模式可能会自由的掌控步骤以得到不同的表现。

具体案例

现在有一个订单类

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();

    }
}

结论

使用建造者模式,指导者可以任意组合创建者的属性生成方法,从而得到不同形式的订单。这里的订单属性太少且生成方式过于简单,属性越多且生成方式越复杂,建造者模式的优势才能更明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值