工程师们都知道,软件开发中构建面向对象的模块化程序是非常重要的,这可以帮您随时进行各种维护的信息更改和功能增加。这就是为什么设计模式是一种非常重要的编程实践的原因。在本文中,我们将深入探讨建造者模式。
什么是建造者模式?
在面向对象的编程中,建造者模式是一种创建设计模式,用于创建复杂的对象,该对象可以作为另一个对象的一部分。在某些情况下,创建对象需要进行多个步骤或具有许多相互关联的属性。建造者模式使我们能够步骤化地创建对象,并在每个步骤中实现我们的要求。
建造者模式的优点
建造者模式允许创建复杂对象的过程变得灵活,同时将其构建与表示分离。这是建造者模式的一项主要优点,因为可以更容易地通过改变表示来实现对我们定义的对象的更改。
此外,建造者模式还有以下优点:
1. 管理复杂对象的创建过程和对象表示的分离。
2. 允许在复杂对象中添加类型变量,并保持相同的构建过程。
3. 能够将相似的构建过程重用于其他系统。
4. 容易添加新对象表示和组合组件到现有构建过程中。
建造者模式的组成部分
建造者模式是由四个主要角色组成:产品,抽象建造者,具体建造者和指挥者。让我们看一下每个角色如何协同工作。
1. 产品
产品是我们要创建的复杂对象。它可能由多个部分和子部件组成。产品由很多属性构成,每个属性都可以是必须的或可选的。
2. 抽象建造者
抽象建造者是定义构建过程的接口。它应该可以创建产品的各个部分,并将它们组合成一个可用的产品。抽象建造者应该做出一些重要决策,例如如何设置依赖关系和如何处理不可用的属性。
3. 具体建造者
具体建造者是实现抽象接口的类。具体建造者根据要构建的具体产品的要求定义了一组步骤。它们根据产品的不同要求,使用不同的部件和子部件组合的算法来创建产品。
4. 指挥者
指挥者协调构建过程。它负责创造一个特定的产品,它将具体构建者委托给创建产品。
建造者模式的实现
为了更好地理解建造者模式,我们将实现一个包含具有多个必需属性和可选属性的产品。这个产品是一家餐厅的菜单,其中许多项目可以选择添加,且菜单可能会有所变化。
首先,我们需要定义一个产品,即菜单。这家餐厅的菜单中包含多个不同的菜品,包括名称,描述,价格和其他一些可选属性:
```
public class Menu {
private String name;
private String description;
private double price;
private boolean isVegetarian;
private boolean isSpicy;
private boolean hasCheese;
//其他属性
}
```
接下来,我们需要定义抽象建造器,并定义构造菜单所需的方法:
```
public interface MenuBuilder {
public void setName(String name);
public void setDescription(String description);
public void setPrice(double price);
public void setIsVegetarian(boolean isVegetarian);
public void setIsSpicy(boolean isSpicy);
public void setHasCheese(boolean hasCheese);
//其他方法
public Menu getMenu();
}
```
然后,让我们定义一个具体的建造者,以便根据要求创建特定的菜单。
```
public class BurgerMenuBuilder implements MenuBuilder {
private Menu menu;
public BurgerMenuBuilder(String name, double price) {
this.menu = new Menu(name, "Burger Menu Item", price);
}
public void setIsVegetarian(boolean isVegetarian) {
this.menu.setIsVegetarian(isVegetarian);
}
public void setIsSpicy(boolean isSpicy) {
this.menu.setIsSpicy(isSpicy);
}
public void setHasCheese(boolean hasCheese) {
this.menu.setHasCheese(hasCheese);
}
public Menu getMenu() {
return menu;
}
}
```
最后,我们需要定义指挥官,以便协调构建过程并完成菜单的创建。在一个餐厅中,指挥者会协调不同的具体建造者来创建菜单:
```
public class MenuDirector {
public Menu buildBurgerMenu(String name, double price, boolean isVegetarian, boolean isSpicy, boolean hasCheese) {
BurgerMenuBuilder burgerMenuBuilder = new BurgerMenuBuilder(name, price);
burgerMenuBuilder.setIsVegetarian(isVegetarian);
burgerMenuBuilder.setIsSpicy(isSpicy);
burgerMenuBuilder.setHasCheese(hasCheese);
return burgerMenuBuilder.getMenu();
}
}
```
现在,我们就可以创建一个完整的菜单,例如一个奶酪汉堡,它是一个具有许多属性的完整菜单:
```
Menu menu = new MenuDirector().buildBurgerMenu("Cheeseburger", 9.99, false, false, true);
```
扫码咨询 领取资料