建造者模式(Builder Pattern)使用多个简单的对象创建一个复杂的对象,用于将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示,然后通过一个Builder类(该Builder类是独立于其他对象的)创建最终的对象。
建造者模式主要用于解决软件系统中复杂对象的创建问题,比如有些复杂对象的创建需要通过各部分的子对象用一定的算法构成,在需求变化时这些复杂对象将面临很大的改变,这十分不利于系统的稳定。但是,使用建造者模式能将它们各部分的算法包装起来,在需求变化后只需调整各个算法的组合方式和顺序,能极大提高系统的稳定性。建造者模式常被用于一些基本部件不会变而其组合经常变化的应用场景下。
注意,建造者模式与工厂模式的最大区别是,建造者模式更关注产品的组合方式和装配顺序,而工厂模式关注产品的生产本身。
建造者模式在设计时有以下几种角色:
- Builder:创建一个复杂产品对象的抽象接口。
- ConcreteBuilder:Builder接口的实现类,用于定义复杂产品各个部件的装配流程。
- Director:构造一个使用Builder接口的对象。
- Product:表示被构造的复杂对象。ConcreteBuilder定义了该复杂对象的装配流程,而Product定义了该复杂对象的结构和内部表示。
以生产一个电脑为例,电脑的生产包括CPU、Memory、Disk等生产过程,这些生产过程对顺序不敏感,这里的Product角色就是电脑。我们还需要定义生产电脑的Builder、ConcreteBuilder和Director。UML的设计如下图:
具体实现如下:
- 定义需要生产的产品Computer
package cn.jaa.builder_pattern; import lombok.Data; @Data public class Computer { private String cpu; private String memory; private String disk; }
- 定义抽象接口ComputerBuilder来描述产品构造和装配的过程
package cn.jaa.builder_pattern; public interface ComputerBuilder { void buildCPU(); void buildMemory(); void buildDisk(); Computer buildComputer(); }
- 定义ComputerBuilder接口实现类ComputerConcreteBuilder以实现构造和装配该产品的各个组件
package cn.jaa.builder_pattern; import cn.jaa.factory_pattern.FactoryDemo; import java.util.logging.Logger; public class ComputerConcreteBuilder implements ComputerBuilder { private static final Logger log = Logger.getLogger(String.valueOf(ComputerConcreteBuilder.class)); Computer computer; public ComputerConcreteBuilder() { computer = new Computer(); } @Override public void buildCPU() { log.info("build cpu..."); computer.setCpu("16core"); } @Override public void buildMemory() { log.info("build memory..."); computer.setMemory("64G"); } @Override public void buildDisk() { log.info("build disk..."); computer.setDisk("1TG"); } @Override public Computer buildComputer() { return computer; } }
- 定义ComputerDirector使用Builder接口实现产品的装配
package cn.jaa.builder_pattern; public class ComputerDirector { public Computer constructComputer(ComputerBuilder computerBuilder) { computerBuilder.buildCPU(); computerBuilder.buildMemory(); computerBuilder.buildDisk(); return computerBuilder.buildComputer(); } }
- 构建Computer测试
package cn.jaa.builder_pattern; import java.util.logging.Logger; /** * @Author: Jaa * @Description: * @Date 2023/11/28 21:37 */ public class BuildComputerTest { private static final Logger log = Logger.getLogger(String.valueOf(BuildComputerTest.class)); public static void main(String[] args) { ComputerDirector computerDirector = new ComputerDirector(); ComputerBuilder computerBuilder = new ComputerConcreteBuilder(); Computer computer = computerDirector.constructComputer(computerBuilder); log.info(computer.getCpu()); log.info(computer.getMemory()); log.info(computer.getDisk()); } }
运行结果: