《Java设计模式及实践》—2.3 建造者模式

举报
华章计算机 发表于 2019/07/22 12:34:20 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第2章,第2.3.1节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

2.3 建造者模式

建造者模式与其他创建型模式一样服务于相同的目标,只不过它出于不同的原因,通过不同的方式实现。在开发复杂的应用程序时,代码往往会变得非常复杂。类会封装更多的功能,类的结构也会变得更加复杂。随着功能量的增加,就需要涵盖更多场景,从而需要构建更多不同的类。

当需要实例化一个复杂的类,以得到不同结构和不同内部状态的对象时,我们可以使用不同的类对它们的实例化操作逻辑分别进行封装,这些类就被称为建造者。每当需要来自同一个类但具有不同结构的对象时,就可以通过构造另一个建造者来进行实例化。

它的概念不仅可以用于不同表现形式的类,还可以用于由其他对象组成的复杂对象。构造建造者类来封装实例化复杂对象的逻辑,符合单一职责原则和开闭原则。实现实例化复杂对象的逻辑被放到了单独的建造者类中。当需要具有不同结构的对象时,我们可以添加新的建造者类,从而实现对修改的关闭和对扩展的开放,如图2-5所示。

 image.png

图 2-5

建造者模式中包含以下类:

  • Product(产品类):需要为其构建对象的类,是具有不同表现形式的复杂或复合对象。

  • Builder(抽象建造者类):用于声明构建产品类的组成部分的抽象类或接口。它的作用是仅公开构建产品类的功能,隐藏产品类的其他功能;将产品类与构建产品类的更高级的类分离开。

  • ConcreteBuilder(具体建造者类):用于实现抽象建造者类接口中声明的方法。除此之外,它还通过getResult方法返回构建好的产品类。

  • Director(导演类):用于指导如何构建对象的类。在建造者模式的某些变体中,导演类已被移除,其角色被客户端或抽象建造者类所代替。

2.3.1 汽车建造者样例

在本节中,我们将在汽车软件中应用建造者模式。首先,存在一个Car类,需要为它创建实例。通过向汽车中添加不同的组件,我们分别可以制造轿车和跑车。当开始设计软件时,需要认识到以下几点:

  • Car类非常复杂,创建类的对象也是一个复杂的操作。在Car类的构造函数中添加所有的实例化逻辑将使其变得体量庞大。

  • 我们需要构建多种类型的汽车类。针对这种情况,我们通常会添加多个不同的构造函数,但直觉告诉我们这并非最好的解决方案。

  • 将来我们可能需要构建多种不同类型的汽车对象。由于市场上对于半自动汽车的需求非常高涨,在不久的将来,我们应该做好准备进行代码扩展而不是重新修改代码。

为此,我们将创建以下如图2-6所示的类结构。

CarBuilder是建造者基类,它包含了四个抽象方法。我们创建了两个具体建造者类:ElectricCarBuilder和GasolineCarBuilder。每个建造者实现类都分别实现了CarBuilder

的所有抽象方法。那些类中不需要的方法(例如ElectricCarBuilder中的addGasTank方法)会被置空或抛出异常。ElectricCar类和GasolineCar类内部结构是不同的。

 image.png

图 2-6

导演类使用抽象建造者类来创建新的汽车对象。buildElectricCar和buildGasolineCar

两个方法略有不同:

 image.png

 

如果想要制造一辆既有电动又有汽油发动机的混合动力汽车:

image.png

image.png

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。