目录
前言
一、什么是建造者模式
二、建造者模式的核心角色
三、建造者模式的优点
四、具体实现
1、抽象建造者类
2、具体建造者类
3、产品类
4、指挥者类
5、客户端代码
总结
前言
在软件工程中,我们经常遇到需要创建复杂对象的情况。这些对象可能由多个部件组成,各个部件的创建和组装可能涉及复杂的逻辑。为了解决这个问题,我们可以使用一种设计模式:建造者模式(Builder Pattern)。它使用多个简单的对象一步一步构建成一个复杂的对象,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。
一、什么是建造者模式
建造者模式的核心目的是将一个对象的创建过程与它的最终表示分离开来,这样做的好处是可以用相同的创建过程来生成不同的结果。这种模式通过解耦对象的构造和表示,增加了系统的灵活性和组件的可重用性。以肯德基的套餐为例:汉堡、可乐、薯条、炸鸡翅等可以看作是产品的各个部分,它们各自的准备方式相对固定。然而,顾客的选择——即这些食品的组合方式——却各不相同,从而形成了各式各样的套餐。生成器模式允许我们定义一个通用的流程(创建套餐的过程),而具体的实现(不同套餐的细节)则可以变化,满足不同顾客的需求。在这个例子中,"构建过程"就是选择和组合各种食物成套餐的过程,而"表示"则是具体的套餐内容。生成器模式通过允许我们在不改变构建过程的情况下改变最终产品的表示,就像我们可以在不改变点餐流程的情况下,根据顾客的喜好提供不同的套餐组合。这样不仅提高了点餐系统的效率,还增强了顾客满意度,因为他们可以得到他们想要的确切套餐。
二、建造者模式的核心角色
- 产品(Product): 这是最终要创建的复杂对象。
- 建造者(Builder): 这个接口定义了创建和装配产品的各个部件所需的方法。
- 具体建造者(ConcreteBuilder): 实现了建造者接口。它知道如何实际构建和装配产品的部件。
- 指挥者(Director): 它负责安排已有模块的顺序,然后告诉建造者开始建造。
三、建造者模式的优点
- 封装性: 由于具体的建造者隐藏了产品的组装过程,所以可以更轻松地改变产品的内部表示。
- 构建和表示分离: 使用不同的建造者可以构建相同的产品,但是表示不同。
- 可重用性: 一个建造者可以被用来多次构建不同的表示。
四、具体实现
以建房子为例子,以下是某房屋建筑的需求描述。建房子的过程都依次为:打地基(buildBase)——>,砌墙(buildWall)——>,封顶 (buildRoof);建造的房子有多样,如普通房子(CommonHouse),高楼(HighBuilding),别墅(Villa)等; 各种房子的建造过程虽然一样,但是具体要求各不相同,即不同的房子有不同的属性, 如地基(base),墙(wall),屋顶(roof)等属性各不相同。
1、抽象建造者类
代码如下(示例):
// 抽象建造者类
abstract class HouseBuilder {
protected String base;
protected String wall;
protected String roof;
public void buildBase() {
this.base = "Cement Base";
}
public void buildWall() {
this.wall = "Brick Wall";
}
public void buildRoof() {
this.roof = "Tile Roof";
}
public abstract House getHouse();
}
2、具体建造者类
代码如下(示例):
// 具体建造者类
class CommonHouseBuilder extends HouseBuilder {
@Override
public House getHouse() {
return new House(base, wall, roof);
}
}
class HighBuildingBuilder extends HouseBuilder {
@Override
public House getHouse() {
return new House(base, wall, roof);
}
}
class VillaBuilder extends HouseBuilder {
@Override
public House getHouse() {
return new House(base, wall, roof);
}
}
3、产品类
代码如下(示例):
// 产品类
class House {
private String base;
private String wall;
private String roof;
public House(String base, String wall, String roof) {
this.base = base;
this.wall = wall;
this.roof = roof;
}
@Override
public String toString() {
return "House{" +
"base='" + base + '\'' +
", wall='" + wall + '\'' +
", roof='" + roof + '\'' +
'}';
}
}
4、指挥者类
代码如下(示例):
// 指挥者类
class ConstructionManager {
public House constructHouse(HouseBuilder builder) {
builder.buildBase();
builder.buildWall();
builder.buildRoof();
return builder.getHouse();
}
}
5、客户端代码
代码如下(示例):
// 客户端代码
public class Main {
public static void main(String[] args) {
ConstructionManager manager = new ConstructionManager();
House commonHouse = manager.constructHouse(new CommonHouseBuilder());
System.out.println(commonHouse);
House highBuilding = manager.constructHouse(new HighBuildingBuilder());
System.out.println(highBuilding);
House villa = manager.constructHouse(new VillaBuilder());
System.out.println(villa);
}
}
在这个例子中,我们定义了一个抽象建造者类HouseBuilder
,它包含了建造房屋所需的基本方法。然后,我们为每种类型的房屋创建了具体的建造者类,如CommonHouseBuilder
、HighBuildingBuilder
和VillaBuilder
。这些具体的建造者类继承了抽象建造者类,并实现了getHouse()
方法来返回特定类型的房屋对象。我们还定义了一个指挥者类ConstructionManager
,它负责指导房屋的构建过程。在客户端代码中,我们创建了一个ConstructionManager
对象,并使用它来构建不同类型的房屋对象。通过这种方式,我们可以灵活地构建不同类型的房屋,而不需要修改现有的代码。
总结
建造者模式是一种强大的工具,可以帮助我们更好地组织和管理复杂对象的创建过程。通过将对象的构建过程与其表示分离,我们可以更灵活地控制对象的创建,并提高代码的可读性和可维护性。