java设计模式之:建造者模式

news/2024/12/29 19:10:16/

文章目录

  • 建造者模式介绍
  • 建造者模式适用场景
  • 案例场景
    • 一坨坨代码实现
    • 重构代码
  • 与工厂模式区别
  • 建造者模式优缺点
  • 总结


该说不说几乎是程序员都知道或者了解设计模式,但大部分小伙伴写代码总是习惯于一把梭。好的代码不只为了完成现有功能,也会考虑后续扩展。通过学习和使用设计模式,开发人员可以提高自己的设计能力和代码水平,更好地完成项目开发任务。

本文聊聊设计模式中的建造者模式,其实我们生活中关于建造者模式的场景不少。就拿买车举例吧,当我们去买车,不会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。

建造者模式介绍

建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。它关注如何一步一步创建一个的复杂对象,不同的具体建造者定义了不同的创建过程,且具体建造者相互独立,增加新的建造者非常方便,无须修改已有代码,系统具有较好的扩展性。

建造者模式结构图:

image.png

  • Builder(抽象建造者):它为创建一个产品Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是buildPart(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。Builder既可以是抽象类,也可以是接口。

  • ConcreteBuilder(具体建造者):它实现了Builder接口,实现各个部件的具体构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。

  • Product(产品角色):它是被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义它的装配过程。

  • Director(指挥者):指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。

建造者模式适用场景

  1. 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。

  2. 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

  3. 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。

  4. 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

案例场景

现实生活中我们去买车,一般同一辆车会有多个版本,根据配置不一样,分为经典版、舒适版、豪华版等,比如经典版是手动挡手动座椅,舒适版是自动挡全景天窗等。

定义产品角色

@Data
public class Car {// 车名称private String name;// 自动挡private String automaticCatch;// 手动挡private String manualTransmission;// 全景天窗private String panoramicSunroof;// 自动座椅private String automaticSeat;// 手动座椅private String manualSeat;// 倒车影像private String reversingImage;}

一坨坨代码实现

public class CarController {public Car getCarInstance(String carName) {Car car = new Car();if ("经典版".equals(carName)) {car.setName("经典版");car.setManualTransmission("手动挡");} else if ("舒适版".equals(carName)) {car.setName("舒适版");car.setAutomaticCatch("自动挡");car.setManualSeat("手动座椅");} else if ("豪华版".equals(carName)) {car.setName("豪华版");car.setAutomaticCatch("自动挡");car.setAutomaticSeat("自动座椅");car.setReversingImage("倒车影像");car.setPanoramicSunroof("全景天窗");} else {throw new IllegalArgumentException("carName is error: carName=" + carName);}return car;}
}

测试

@Test
public void test(){CarController carController = new CarController();System.out.println(carController.getCarInstance("豪华版").toString());
}
Car(name=豪华版, automaticCatch=自动挡, manualTransmission=null, panoramicSunroof=全景天窗, automaticSeat=自动座椅, manualSeat=null, reversingImage=倒车影像)

以上这段使用if else方式实现的代码,目前已经满足的我们的一些功能,但其实汽车的配置是有很多的,种类一旦多了,上面的代码就会显得很臃肿,也不好维护,下面我们用建造者模式来重构。

重构代码

创建抽象建造者类

public abstract class CarBuilder {public abstract Car buildClassic();public abstract Car buildComfortable();public abstract Car buildLuxury();
}

创建具体建造者类

public class CarConcreteBuilder extends CarBuilder {@Overridepublic Car buildClassic() {Car car = new Car();car.setName("经典版");car.setManualTransmission("手动挡");return car;}@Overridepublic Car buildComfortable() {Car car = new Car();car.setName("舒适版");car.setAutomaticCatch("自动挡");car.setManualSeat("手动座椅");return car;}@Overridepublic Car buildLuxury() {Car car = new Car();car.setName("豪华版");car.setAutomaticCatch("自动挡");car.setAutomaticSeat("自动座椅");car.setReversingImage("倒车影像");car.setPanoramicSunroof("全景天窗");return car;}
}

创建我们的导演类

public class CarDirector {private CarBuilder carBuilder;public CarDirector(CarBuilder carBuilder) {this.carBuilder = carBuilder;}public Car classicConstruct() {return carBuilder.buildClassic();}public Car comfortableConstruct() {return carBuilder.buildComfortable();}public Car luxuryConstruct() {return carBuilder.buildLuxury();}
}

测试

@Test
public void test(){CarBuilder carBuilder = new CarConcreteBuilder();CarDirector carDirector = new CarDirector(carBuilder);Car comfortableCar = carDirector.luxuryConstruct();System.out.println(comfortableCar);
}
Car(name=豪华版, automaticCatch=自动挡, manualTransmission=null, panoramicSunroof=全景天窗, automaticSeat=自动座椅, manualSeat=null, reversingImage=倒车影像)

测试结果是一样的,调用方式也基本类似。但是目前的代码结构却可以让你很方便的进行扩展业务开发。而不是像以往一样把所有代码都写到if else里面。

与工厂模式区别

工厂模式是由工厂类来负责创建对象,而建造者模式也是让具体建造者类负责创建对象,那这两者有什么区别呢?

实际上工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。而建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,“定制化”地创建不同的对象。

可以形象的解释:顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。对于披萨来说,用户又有各种配料可以定制,比如奶酪、西红柿、起司,我们通过建造者模式根据用户选择的不同配料来制作披萨

建造者模式优缺点

主要优点:

  1. 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

  2. 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合“开闭原则”

  3. 由于具体每个建造者过程是独立的,因此可以对过程更加细化,而不会对其它模块产生影响。

主要缺点:

  1. 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。

  2. 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

总结

建造者模式的核心在于如何一步步构建一个包含多个组成部件的完整对象,使用相同的构建过程构建不同的产品,在软件开发中,如果我们需要创建复杂对象并希望系统具备很好的灵活性和可扩展性可以考虑使用建造者模式。

设计模式能带给你的是一些思想,但在平时的开发中怎么样清晰的提炼出符合此思路的建造模块,是比较难的。需要经过一些锻炼和不断承接更多的项目,从而获得这部分经验。有的时候你的代码写的好,往往是倒逼的,复杂的业务频繁的变化,不断的挑战!


http://www.ppmy.cn/news/249347.html

相关文章

手持小电风扇原理图挂脖小风扇电路图

炎热的夏天又又又来了! 虽然现在家里、办公室都有空调,但是当我们刚从暴热的室外进入室内时,空调还是很难让我们快速拥有舒爽温度,很多人都会选择一个台式小风扇作为辅助降温产品。 但市面上的风扇品牌繁多,怎么才能选…

计算机电源德国产,好电源德国造 bequiet!E7模块化电源评测

好电源德国造 bequiet!E7模块化电源评测 出处:快科技 2010-03-18 12:59:33 作者:良宵 编辑:良宵[爆料] 收藏文章 内容导航: 第[01]页:[导言]第[02]页:[电源开箱赏析]第[03]页:[电源外观赏析…

java转动的风扇课程设计,课程设计—智能风扇设计报告

课程设计—智能风扇设计报告 1 智能风扇设计报告智能风扇设计报告 学院学院信息工程学院 专业专业自 动 化 班级班级 姓名姓名 日期日期2012 年 6 月 14 日 2 基于单片机的智能电风扇控制系统基于单片机的智能电风扇控制系统 第第1节节 引引 言言 电风扇曾一度被认为是空调产品…

计算机电源风扇维修,电脑电源开关维修和电源风扇加油图解全过程.doc

窗体顶端 窗体底端 电源开关维修及电源风扇加油图解全过程 2010-05-06 17:56:19 来源:计算机故障查询网 浏览:804次 - 今天一朋友拿了部联想电脑(虽然俺不喜欢,但每个人有自己的爱好,就没说啥)给我,说让我帮他的电脑体检一下,说开不了机于是开展程序化工…

暗影精灵4风扇转速调节_惠普暗影精灵2怎么调节风扇?

展开全部 以win 7系统为例,调CPU散热风扇转速的步骤如下: 1,单击桌面左下角的“开始“,62616964757a686964616fe59b9ee7ad9431333365633836选择”控制面板“,打开控制面板; 2,在面板选择系统和安全; 3,面板中选择系统和安全; 4,选择高性能→选择更改计划设置; 5,选择高…

ibm服务器aix系统查看cpu,aix查看cpu,内存,电源,风扇信息

lscfg -vp |grep -i -p dimm 查看内存的详细信息root@test:/# lscfg -vp |grep -i -p dimm Memory DIMM: Record Name.................VINI Flag Field..................XXMS Hardware Location Code......U78AA.001.WZSGZ30-P1-C18-C1 Customer Card ID Number.....31D2 Ser…

户外电源品牌之间比较的是什么?

如今市面上有许多的户外电源品牌,不同的户外电源在细节与功能上都有着不同的展示。而在户外电源市场上,不时可以看见不同的户外电源品牌被各种各样的比较着,同为便携式储能产品,都是为了给户外用电提供补电服务,他们的…

计算机关机后风扇还转,小编教你电脑关机后CPU风扇还在转怎么解决

一般来说电脑我们在执行关机命令之后,电脑就会关机并且关闭电源,CPU风扇什么的都会停止,但是有时一些电脑会遇到一些情况,在电脑关机之后电源并没工正真关闭,CPU风扇也还在转动,那么这是什么原因&#xff0…