你好,我是程序员。
今天我们来学习23种设计模式中的建造者模式。构造者模式是什么?有什么优缺点?使用场景,与工厂模式有什么区别?简单代码实现。
一、是什么?
建造者模式(Builder Pattern)是一种创建对象的设计模式,它将复杂对象的创建过程分解为多个步骤,并将这些步骤封装在独立的建造者类中。通过使用建造者模式,可以将对象的创建过程与对象的具体表示分离开来,从而使得对象的创建过程更加灵活和可复用。
二、构造者模式的优点包括:
1. 封装性好:将复杂对象的创建过程封装在独立的建造者类中,使得对象的创建过程更加清晰和易于理解。
2. 灵活性高:通过使用建造者模式,可以灵活地修改对象的创建过程,而不需要修改对象的具体表示。
3. 可复用性强:建造者模式将对象的创建过程分解为多个步骤,可以将这些步骤封装在独立的建造者类中,从而提高了代码的可复用性。
三、建造者模式的缺点包括:
1. 类的数量增多:由于将对象的创建过程分解为多个步骤,并将这些步骤封装在独立的建造者类中,因此需要创建多个建造者类,从而增加了类的数量。
2. 建造过程复杂:如果对象的创建过程过于复杂,可能会导致建造者类的建造过程也变得复杂,从而增加了代码的维护难度。
四、使用场景:
建造者模式适合于需要创建复杂对象的场景,例如创建汽车、飞机、计算机等复杂对象。在这些场景中,对象的创建过程可能涉及多个步骤和多个部件,使用建造者模式可以将对象的创建过程分解为多个步骤,并将这些步骤封装在独立的建造者类中,从而提高代码的灵活性和可复用性。
五、构造者模式与工厂模式的区别:
工厂模式用来创建一组不同,但相关的对象,比如集成同一父类,或者接口的一组子类,由给定的参数来决定创建哪种类的的对象。
建造者模式是用来创建一种类型的复杂对象,可以通过设置不同的可选参数,定制化创建不同的对象。
六、代码示例:
import java.util.HashMap;
import java.util.Map;
public class Meal {
private String food;
private String drink;
private Map<String, Integer> toppings;
// 构造函数,用于初始化 Meal 对象的属性
public Meal(String food, String drink, Map<String, Integer> toppings) {
this.food = food;
this.drink = drink;
this.toppings = toppings;
}
// 获取食物的方法
public String getFood() {
return food;
}
// 获取饮料的方法
public String getDrink() {
return drink;
}
// 获取配料的方法
public Map<String, Integer> getToppings() {
return toppings;
}
// 显示 Meal 对象信息的方法
public void display() {
System.out.println("Meal: " + food + ", " + drink + ", " + toppings);
}
// 建造者类,用于构建 Meal 对象
public static class MealBuilder {
private String food;
private String drink;
private Map<String, Integer> toppings = new HashMap<>();
// 设置食物的方法
public MealBuilder setFood(String food) {
this.food = food;
return this;
}
// 设置饮料的方法
public MealBuilder setDrink(String drink) {
this.drink = drink;
return this;
}
// 添加配料的方法
public MealBuilder addTopping(String topping, int quantity) {
this.toppings.put(topping, quantity);
return this;
}
// 构建 Meal 对象的方法
public Meal build() {
return new Meal(food, drink, toppings);
}
}
public static void main(String[] args) {
// 创建 MealBuilder 对象,并使用它来构建 Meal 对象
MealBuilder mealBuilder = new MealBuilder()
.setFood("披萨")
.setDrink("可乐")
.addTopping("芝士", 2)
.addTopping("香肠", 1);
// 使用构建好的 MealBuilder 对象构建 Meal 对象
Meal meal = mealBuilder.build();
// 显示 Meal 对象的信息
meal.display();
}
}
在上述示例中,我们创建了一个 Meal 类来表示餐点,它具有食物、饮料和配料等属性。然后,我们创建了一个 MealBuilder 类来构建 Meal 对象。 MealBuilder 类提供了一系列方法,用于设置食物、饮料和添加配料。最后,在 main 方法中,我们创建了一个 MealBuilder 对象,并使用它来构建一个 Meal 对象。通过调用 build 方法,我们可以得到一个完整的 Meal 对象,并使用 display 方法来显示它的信息。
如果一个类中有很多属性,为了避免构造者函数的参数列表过长,我们可以使用set()方法来解决。如果有以下情况,就要考虑用构造者模式:
1、需要校验多个必填参数;
2、属性之前有依赖关系或者约束条件;
3、创建不可变对象;
总结回顾
建造者模式将复杂对象的创建过程分解为多个步骤,并将这些步骤封装在独立的建造者类或方法。
构造者模式的优点:
1、封装性好;
2、灵活性高;
3、复用性强;
构造者模式的缺点:
1、类或方法的数量多;
2、构造过程复杂;
构造者模式与工厂模式的区别:
工厂模式用来创建一组不同,但相关的对象。建造者模式是用来创建一种类型的复杂对象。
想要了解更多设计模式相关知识,请关注我吧,下期持续更新。