Java实现建造者模式

建造者模式是一种创建型设计模式,它的目的是将一个复杂的对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。 适用场景: 1. 当一个对象的构建过程比较复杂,需要多个步骤以特定顺序执行时,可以使用建造者模式。例如,一个汽车的构建过程包括创建车身、安装发动机、安装轮胎等多个步骤,每个步骤都有特定的顺序。 2. 当相同的构建过程可以创建不同表示时,也适合使用建造者模式。例如,汽车的构建过程可以创建轿车、SUV、跑车等不同的类型。 好处: 建造者模式的好处包括: 1. 解耦构建过程和表示,使得代码结构更加清晰。 2. 可以通过控制不同的建造者,创建不同的表示对象。 3. 建造者模式可以复用相同的构建过程来构建不同的对象。 下面是一个简单的Java代码示例: ``` // 产品类,即要构建的复杂对象 class Car { private String engine; private String tire; public void setEngine(String engine) { this.engine = engine; } public void setTire(String tire) { this.tire = tire; } @Override public String toString() { return "Car{" + "engine='" + engine + '\'' + ", tire='" + tire + '\'' + '}'; } } // 抽象建造者类,定义构建过程的抽象方法 abstract class CarBuilder { protected Car car; public void createCar() { car = new Car(); } public abstract void buildEngine(); public abstract void buildTire(); public Car getCar() { return car; } } // 具体建造者类,实现构建过程的具体方法 class SedanCarBuilder extends CarBuilder { @Override public void buildEngine() { car.setEngine("Sedan Engine"); } @Override public void buildTire() { car.setTire("Sedan Tire"); } } class SUVCarBuilder extends CarBuilder { @Override public void buildEngine() { car.setEngine("SUV Engine"); } @Override public void buildTire() { car.setTire("SUV Tire"); } } // 指挥者类,负责构建对象 class Director { private CarBuilder carBuilder; public void setCarBuilder(CarBuilder carBuilder) { this.carBuilder = carBuilder; } public Car construct() { carBuilder.createCar(); carBuilder.buildEngine(); carBuilder.buildTire(); return carBuilder.getCar(); } } // 客户端代码 public class BuilderPatternExample { public static void main(String[] args) { Director director = new Director(); CarBuilder sedanCarBuilder = new SedanCarBuilder(); director.setCarBuilder(sedanCarBuilder); Car sedanCar = director.construct(); System.out.println("Sedan Car: " + sedanCar); CarBuilder suvCarBuilder = new SUVCarBuilder(); director.setCarBuilder(suvCarBuilder); Car suvCar = director.construct(); System.out.println("SUV Car: " + suvCar); } } ``` 输出结果: ``` Sedan Car: Car{engine='Sedan Engine', tire='Sedan Tire'} SUV Car: Car{engine='SUV Engine', tire='SUV Tire'} ``` 以上示例中,Car为要构建的复杂对象,CarBuilder为抽象建造者类,定义了构建过程的抽象方法。SedanCarBuilder和SUVCarBuilder为具体建造者类,实现了构建过程的具体方法。Director为指挥者类,负责构建对象。客户端代码通过设置不同的建造者来构建不同类型的Car对象。

MyBatis框架中的建造者模式XMLConfigBuilder和XMLMapperBuilder

在MyBatis框架中,XMLConfigBuilder和XMLMapperBuilder是建造者模式的典型应用。 建造者模式是一种创建型设计模式,用于将对象的构建过程与其表示分离,以便与同一个构建过程可以创建不同的表示。建造者模式将对象的构建过程委派给不同的建造者,每个建造者负责构建对象的一部分,最后由指挥者调用建造者的方法来组装对象。这样可以实现创建复杂对象的过程简化和灵活性的提高。 XMLConfigBuilder和XMLMapperBuilder是MyBatis框架中的两个重要建造者类。 XMLConfigBuilder用于解析MyBatis的配置文件,即mybatis-config.xml,它的主要职责是构建Configuration对象。XMLConfigBuilder根据配置文件的内容,将各个子配置(如数据源配置、类型别名配置、映射器配置等)的解析委托给相应的建造者进行处理,最后通过Configuration对象将这些配置整合在一起。 XMLMapperBuilder用于解析Mapper映射文件,即*.xml,它的主要职责是构建MappedStatement对象和将其注册到Configuration对象中。XMLMapperBuilder通过解析Mapper映射文件中的SQL语句和对应的解析器,来构建MappedStatement对象。 以下是MyBatis框架中XMLConfigBuilder和XMLMapperBuilder的部分原码: ```java // XMLConfigBuilder.java public class XMLConfigBuilder extends BaseBuilder { public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) { // ... } public Configuration parse() { // ... parseConfiguration(parser.evalNode("/configuration")); return configuration; } private void parseConfiguration(XNode root) { try { // ... XNode environmentsNode = root.evalNode("environments"); parseEnvironments(environmentsNode); // ... } catch (Exception e) { // ... } } // ... } // XMLMapperBuilder.java public class XMLMapperBuilder extends BaseBuilder { public XMLMapperBuilder(InputStream inputStream, Configuration configuration, String resource, Map<String, XNode> sqlFragments, String namespace) { // ... } public void parse() { try { // ... XNode context = document.getRootElement(); // ... configurationElement(context); } catch (Exception e) { // ... } } private void configurationElement(XNode context) { try { String namespace = context.getStringAttribute("namespace"); // ... buildStatementFromContext(context.evalNodes("select|insert|update|delete")); // ... } catch (Exception e) { // ... } } private void buildStatementFromContext(List<XNode> list) { // ... for (XNode context : list) { final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId); // ... statementParser.parseStatementNode(); } } // ... } ``` 总结: 通过建造者模式,MyBatis框架将对象的构建过程与对象的表示分离,使得构建过程灵活且易于维护。XMLConfigBuilder和XMLMapperBuilder用于解析配置文件和映射文件,将其构建为相应的对象,并将它们注册到MyBatis的Configuration对象中。这样可以实现对配置文件和映射文件的统一管理和灵活使用。建造者模式在MyBatis框架中的应用体现了面向对象设计原则中的开闭原则和单一职责原则。

Apache POI框架中的建造者模式WorkbookBuilder

Apache POI是一个用于读写Microsoft Office格式文件的开源框架。它包含了一系列的API,可用于创建、读取和修改Excel、Word和PowerPoint等文件。 在Apache POI中,WorkbookBuilder是一种建造者模式的实现,用于创建Workbook对象。Workbook对象代表了Excel文件,在POI中有多种实现,如HSSFWorkbook用于操作.xls格式的文件,XSSFWorkbook用于操作.xlsx格式的文件。 WorkbookBuilder使用了流畅的接口,提供了一种可读性强、易于使用和灵活性高的方式来创建Workbook对象。它通过一系列的方法链式调用,逐步构建Workbook对象的各个属性和内容。下面是WorkbookBuilder的完整原码: ```java public class WorkbookBuilder { private Workbook workbook; public WorkbookBuilder() { this.workbook = new XSSFWorkbook(); } public WorkbookBuilder createSheet(String sheetName) { workbook.createSheet(sheetName); return this; } public WorkbookBuilder createRow(int sheetIndex, int rowIndex) { workbook.getSheetAt(sheetIndex).createRow(rowIndex); return this; } public WorkbookBuilder createCell(int sheetIndex, int rowIndex, int columnIndex, String value) { Cell cell = workbook.getSheetAt(sheetIndex).getRow(rowIndex).createCell(columnIndex); cell.setCellValue(value); return this; } public Workbook build() { return workbook; } } ``` 使用WorkbookBuilder创建一个Workbook对象的示例代码如下: ```java Workbook workbook = new WorkbookBuilder() .createSheet("Sheet1") .createRow(0, 0) .createCell(0, 0, 0, "Hello World!") .build(); ``` 上述代码首先创建一个WorkbookBuilder对象,然后通过链式调用的方式,连续调用createSheet、createRow和createCell方法来创建一个包含一个单元格的Excel文件,最后通过build方法获取到创建好的Workbook对象。 总结: Apache POI框架中的WorkbookBuilder是一种建造者模式的实现,它提供了一种流畅的接口来构建Workbook对象。使用WorkbookBuilder可以有效地降低代码的复杂度,提高代码的可读性和可维护性。建造者模式可以帮助开发者逐步构建复杂对象,而不需要一次性指定所有的参数。这使得构建过程更加灵活,并且使代码易于扩展和修改。