建造者模式

设计模式

本系列文章均是博主原创,意在记录学习上的知识,同时一起分享学习心得。

24种设计模式


前言

本节介绍建造者模式的概念、使用场景、实现方式。


一、概念

建造者模式是让建造类来负责对象的创建工作。它通常以Builder作为命名的结尾,我们可以吧校验逻辑放置在Builder类中,先创建建造者类,并且通过set方法设置建造者的变量值,然后在使用builder()方法真正创建对象之前,先做集中的逻辑校验,校验通过后才会创建对象。

与工厂模式的区别:

工厂模式:用来创建不用但是相关类型的对象(继承同一父类或实现同一接口),由给定的参数来判断具体使用哪一种类型的对象。

建造者模式:用来创建一种类型复杂的对象,通过设置不同的可选参数,“定制化”地创建不同的对象。

二、使用步骤

如果一个类中有很多属性,为了避免构造函数的参数列表过长,影响代码的可读性和易用性,我们可以通过构造函数配合set方法来解决,但是存在以下任一情况,就要考虑使用建造者模式:

  • 把类的必填属性放到构造函数中,强制创建对象的时候就设置。
  • 如果类的属性之间有互相依赖的关系或者约束条件。
  • 如果希望创建不可变对象。

代码如下(示例):

public class Food {

    private String foodName;
    private Long price;
    private String type;

    public Food(FoodBuilder builder){
        foodName = builder.getFoodName();
        price = builder.getPrice();
        type = builder.getType();
    }

    @Override
    public String toString() {
        return "Food{" +
                "foodName='" + foodName + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                '}';
    }
}
public class FoodBuilder {

    private static final Integer ZERO = 0;

    private String foodName;
    private Long price;
    private String type;

    public Food build() {
        if (foodName == null || foodName.isEmpty()){
            throw new RuntimeException("fooName is not be null");
        }
        if (price.compareTo(0L) < ZERO){
            throw new RuntimeException("price should be large 0");
        }
        return new Food(this);
    }

    public FoodBuilder setFoodName(String foodName) {
        this.foodName = foodName;
        return this;
    }

    public FoodBuilder setPrice(Long price) {
        this.price = price;
        return this;
    }

    public FoodBuilder setType(String type) {
        this.type = type;
        return this;
    }

    public String getFoodName() {
        return foodName;
    }

    public Long getPrice() {
        return price;
    }

    public String getType() {
        return type;
    }
}
@Test
public void buildTest() {
    Food food = new FoodBuilder()
            .setFoodName("香蕉")
            .setPrice(1L)
            .setType("")
            .build();
    System.out.println(food);
}

在这里插入图片描述


总结

实际上,我们也不用太学院派,非得把工厂模式、建造者模式分得那么清楚,我们需要知道的是,每个模式为什么要这么设计,能解决什么问题。只有了解了这些最本质的东西,我们才能不生搬硬套,才能灵活应用,甚至可以混用各种模式创造出新的模式,来解决特点场景的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值