《Java设计模式及实践》—2.3 建造者模式
2.3 建造者模式
建造者模式与其他创建型模式一样服务于相同的目标,只不过它出于不同的原因,通过不同的方式实现。在开发复杂的应用程序时,代码往往会变得非常复杂。类会封装更多的功能,类的结构也会变得更加复杂。随着功能量的增加,就需要涵盖更多场景,从而需要构建更多不同的类。
当需要实例化一个复杂的类,以得到不同结构和不同内部状态的对象时,我们可以使用不同的类对它们的实例化操作逻辑分别进行封装,这些类就被称为建造者。每当需要来自同一个类但具有不同结构的对象时,就可以通过构造另一个建造者来进行实例化。
它的概念不仅可以用于不同表现形式的类,还可以用于由其他对象组成的复杂对象。构造建造者类来封装实例化复杂对象的逻辑,符合单一职责原则和开闭原则。实现实例化复杂对象的逻辑被放到了单独的建造者类中。当需要具有不同结构的对象时,我们可以添加新的建造者类,从而实现对修改的关闭和对扩展的开放,如图2-5所示。
图 2-5
建造者模式中包含以下类:
Product(产品类):需要为其构建对象的类,是具有不同表现形式的复杂或复合对象。
Builder(抽象建造者类):用于声明构建产品类的组成部分的抽象类或接口。它的作用是仅公开构建产品类的功能,隐藏产品类的其他功能;将产品类与构建产品类的更高级的类分离开。
ConcreteBuilder(具体建造者类):用于实现抽象建造者类接口中声明的方法。除此之外,它还通过getResult方法返回构建好的产品类。
Director(导演类):用于指导如何构建对象的类。在建造者模式的某些变体中,导演类已被移除,其角色被客户端或抽象建造者类所代替。
2.3.1 汽车建造者样例
在本节中,我们将在汽车软件中应用建造者模式。首先,存在一个Car类,需要为它创建实例。通过向汽车中添加不同的组件,我们分别可以制造轿车和跑车。当开始设计软件时,需要认识到以下几点:
Car类非常复杂,创建类的对象也是一个复杂的操作。在Car类的构造函数中添加所有的实例化逻辑将使其变得体量庞大。
我们需要构建多种类型的汽车类。针对这种情况,我们通常会添加多个不同的构造函数,但直觉告诉我们这并非最好的解决方案。
将来我们可能需要构建多种不同类型的汽车对象。由于市场上对于半自动汽车的需求非常高涨,在不久的将来,我们应该做好准备进行代码扩展而不是重新修改代码。
为此,我们将创建以下如图2-6所示的类结构。
CarBuilder是建造者基类,它包含了四个抽象方法。我们创建了两个具体建造者类:ElectricCarBuilder和GasolineCarBuilder。每个建造者实现类都分别实现了CarBuilder
的所有抽象方法。那些类中不需要的方法(例如ElectricCarBuilder中的addGasTank方法)会被置空或抛出异常。ElectricCar类和GasolineCar类内部结构是不同的。
图 2-6
导演类使用抽象建造者类来创建新的汽车对象。buildElectricCar和buildGasolineCar
两个方法略有不同:
如果想要制造一辆既有电动又有汽油发动机的混合动力汽车:
- 点赞
- 收藏
- 关注作者
评论(0)