建造者模式介绍
建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造出一个复杂的对象。
可以将建造者模式理解为,假设我们有一个对象需要建立,这个对象是由多个组件(Component)组合而成,每个组件的建立都比较复杂,但运用组件来建立所需的组件对象非常简单,所以我们就可以将构建复杂组件的步骤与运用组件构建对象分离,从而构造出复杂的对象。
建造者模式包含如下角色:
- 抽象建造者类(Builder):这是一个接口,该接口除了为创建一个Product对象的各个组件定义了若干个方法之外,还要定义返回Product对象的方法(定义构造步骤);
- 具体建造者类(ConcreteBuilder):实现 Builder 接口的类,实现Builder接口中所定义的方法(生产各个组件);
- 产品类(Product):要创建的复杂对象;
- 指挥者类(Director):指挥者是一个类,该类需要含有Builder接口声明的变量。指挥者的职责是负责向用户提供具体生成器,即指挥者将请求具体生成器类来构造用户所需要的Product对象,如果所请求的具体生成器成功地构造出Product对象,指挥者就可以让该具体生产器返回所构造的Product对象。(按照步骤组装部件,并返回Product)
举个?:
构造一台电脑,需要经过以下步骤:生产主机、生产显示器、生产键盘、生产鼠标。虽然不同的电脑需要的主机、显示器和键鼠型号不同,但不管怎样,它总是需要按照以上步骤来构建。对于这个例子,我们就可以使用生成器模式来生成一台电脑,他需要通过多个步骤来生成。代码如下。
产品类:
public class Computer { private String keyboard; private String mouse; private String screen; private String Master; // 省略getter setter toString}
抽象建造者类:(生产电脑的抽象类)
public abstract class ComputerBuilder { protected Computer computer = new Computer(); public abstract void buildKeyboard(); public abstract void buildMouse(); public abstract void buildScreen(); public abstract void buildMaster(); public abstract Computer createComputer();}
具体建造者类:(如惠普、戴尔)
public class HPComputerBuilder extends ComputerBuilder{ @Override public void buildKeyboard() { computer.setKeyboard("cherry 青轴机械键盘"); } @Override public void buildMouse() { computer.setMouse("雷蛇竞技鼠标"); } @Override public void buildScreen() { computer.setScreen("1920*1080 AOE 28寸曲面屏"); } @Override public void buildMaster() { computer.setMaster("(i7,16g,512SSD,1060)的惠普主机"); } @Override public Computer createComputer() { return computer; }}public class DellComputerBuilder extends ComputerBuilder{ @Override public void buildKeyboard() { computer.setKeyboard("dell 青轴机械键盘"); } @Override public void buildMouse() { computer.setMouse("dell 官方竞技鼠标"); } @Override public void buildScreen() { computer.setScreen("1920*1080 dell 28寸曲面屏"); } @Override public void buildMaster() { computer.setMaster("(i7,16g,1T SSD,1060)的戴尔主机"); } @Override public Computer createComputer() { return computer; }}
指挥者类:(对组件进行组装并生成产品)
public class Director { private ComputerBuilder computerBuilder; public Director(ComputerBuilder computerBuilder) { this.computerBuilder = computerBuilder; } public Computer constructComputer() { computerBuilder.buildMaster(); computerBuilder.buildMouse(); computerBuilder.buildScreen(); computerBuilder.buildKeyboard(); return computerBuilder.createComputer(); }}
指挥者类 Director 在建造者模式中具有很重要的作用,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类。
测试类:
public class Client { public static void main(String[] args) { // 构造一台戴尔电脑 showComputer(new DellComputerBuilder()); // 构造一台惠普电脑 showComputer(new HPComputerBuilder()); } private static void showComputer(ComputerBuilder builder) { Director director = new Director(builder); Computer computer = director.constructComputer(); System.out.println(computer); }}
优缺点
优点:
- 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;
- 将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程;
- 建造者模式很容易进行扩展。如果有新的需求,通过实现一个新的建造者类(如再构造一台华硕电脑)就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险。符合开闭原则。
缺点:
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大(如电脑和手机),则不适合使用建造者模式,因此其使用范围受到一定的限制。
使用场景
创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
创建型模式对比
工厂方法模式注重的是整体对象的创建方式;而建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。举个例子,如果要创建一台手机,直接产生一个CPU为天玑9000、运行内存为8G、容量为256G、屏幕材质为LCD的智能手机;而如果使用建造者模式,则需要组装CPU、内存、屏幕等部分。
抽象工厂模式实现对产品族的创建,采用抽象工厂模式则是不需要关心构建过程,只关心什么产品由什么工厂生产即可。建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品。
参考
(140条消息) 23 种设计模式详解(全23种)_鬼灭之刃的博客-CSDN博客_设计模式
https://www.bilibili.com/video/BV1Np4y1z7BU