建造者(Builder)模式也被称为生成器模式,创建型模式是主要是为了解决对象的创建的方式,相较于单态则是为了保证创建的对象的唯一性问题,建造者模式是为了解决复杂对象的创建,尤其是子对象的构建过程存在顺序和逻辑关系的时候。
模式场景与说明比如对象由多个复杂的子对象组成的情况,多个对象组成的方式一般较为稳定,但是子对象的创建过程可能会发生变化,根据OCP原则,可以考虑对子对象的创建过程进行封装。
实现方式一个通用创建型模式的使用可能会有如下部分组成:
组成部分 类型 作用 Product 类 创建的内容 Builder 接口 包含返回Product的build或者composite方法 ConcreteBuilder 具体建造类 实现了Builder接口的具体建造类,此类在加载时会创建一个Product对象 Director 调配类 一般此类的构建函数包含Builder类型的参数,通过此类提供统一的调配,包括顺序和逻辑,简单场景下可以不需要此类的存在 示例概要
// Product class Computer { private String cpu; private String memory; private String graphics; private String motherboard; public void setCpu(String cpu) { this.cpu = cpu; } public void setMemory(String memory) { this.memory = memory; } public void setGraphics(String graphics) { this.graphics = graphics; } public void setMotherboard(String motherboard) { this.motherboard = motherboard; } @Override public String toString(){ return "Computer information: \n" + "CPU: " + this.cpu + "\n" + "Memory: " + this.memory + "\n" + "Graphics: " + this.graphics + "\n" + "Motherboard: " + this.motherboard; } } interface Builder { void buildMotherboard(String motherboard); void buildGraphics(String graphics); void buildCpu(String cpu); void buildMemory(String memory); Computer build(); } class ConcreteBuilder implements Builder { private Computer computer = new Computer(); @Override public void buildMotherboard(String motherboard){ this.computer.setMotherboard(motherboard); } @Override public void buildGraphics(String graphics){ this.computer.setGraphics(graphics); } @Override public void buildCpu(String cpu) { this.computer.setCpu(cpu); } @Override public void buildMemory(String memory){ this.computer.setMemory(memory); } @Override public Computer build(){ return this.computer; } } class Director { private Builder builder = null; Director(Builder builder) { this.builder = builder; } Computer buildComputer(String motherboard, String graphics, String cpu,String memory) { this.builder.buildMotherboard(motherboard); this.builder.buildGraphics(graphics); this.builder.buildCpu(cpu); this.builder.buildMemory(memory); return this.builder.build(); } } public class BuilderTest { public static void main(String[] args) { Builder builder = new ConcreteBuilder(); Director director = new Director(builder); Computer computer = director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3"); System.out.print(computer); } }
执行结果为:
Computer information: CPU: 2.5 GHz Quad-Core Intel Core i7 Memory: 16 GB 1600 MHz DDR3 Graphics: Intel Iris Pro 1536 MB Motherboard: 820-00xxx
但是需要注意此模式解决的问题和Factory不同,因此它是在具体建造类的加载期间就生成了Product的实例,可结合如下示例代码进行进一步的思考
Builder builder = new ConcreteBuilder(); Director director = new Director(builder); Computer computer = director.buildComputer("820-00xxx", "Intel Iris Pro 1536 MB","2.5 GHz Quad-Core Intel Core i7","16 GB 1600 MHz DDR3"); System.out.println(computer); Computer computer2 = director.buildComputer("830-00xxx", "Intel Iris Pro 3032 MB","2.5 GHz Quad-Core Intel Core i7","32 GB 1600 MHz DDR3"); System.out.println(computer2); System.out.println(computer);
执行结果如下所示
Computer information: CPU: 2.5 GHz Quad-Core Intel Core i7 Memory: 16 GB 1600 MHz DDR3 Graphics: Intel Iris Pro 1536 MB Motherboard: 820-00xxx Computer information: CPU: 2.5 GHz Quad-Core Intel Core i7 Memory: 32 GB 1600 MHz DDR3 Graphics: Intel Iris Pro 3032 MB Motherboard: 830-00xxx Computer information: CPU: 2.5 GHz Quad-Core Intel Core i7 Memory: 32 GB 1600 MHz DDR3 Graphics: Intel Iris Pro 3032 MB Motherboard: 830-00xxx其他设计模式
- https://liumiaocn.blog.csdn.net/article/details/106954154