设计模式
本系列文章均是博主原创,意在记录学习上的知识,同时一起分享学习心得。前言
本节介绍建造者模式的概念、使用场景、实现方式。
一、概念
建造者模式是让建造类来负责对象的创建工作。它通常以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);
}
总结
实际上,我们也不用太学院派,非得把工厂模式、建造者模式分得那么清楚,我们需要知道的是,每个模式为什么要这么设计,能解决什么问题。只有了解了这些最本质的东西,我们才能不生搬硬套,才能灵活应用,甚至可以混用各种模式创造出新的模式,来解决特点场景的问题。