1.建造者(Builder)模式定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2.建造者模式主要优点
其缺点如下
建造者模式和工厂模式的关注点不同:
建造者模式注重零部件的组装过程,而工厂方法模式更注重零部件的创建过程,但两者可以结合使用。
3.模式的结构与实现
建造者(Builder)模式由产品、抽象建造者、具体建造者、指挥者等 4 个要素构成,现在我们来分析其基本结构和实现方法。
建造者模式的主要角色如下:
建造者模式结构图:
4.建造者模式实现,以建造机器人为例
package com.lw.designpattern.builder; /** * @Classname Robot * @Description 机器人模型 * @Author lw * @Date 2019-12-25 08:38 */ public class Robot { /** 头 */ private String head; /** 身体 */ private String body; /** 手 */ private String hand; /** 脚 */ private String foot; public String getHead() { return head; } public void setHead(String head) { this.head = head; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getHand() { return hand; } public void setHand(String hand) { this.hand = hand; } public String getFoot() { return foot; } public void setFoot(String foot) { this.foot = foot; } }
package com.lw.designpattern.builder; /** * @Classname IBuildRobot * @Description 建造机器人接口 * @Author lw * @Date 2019-12-25 08:39 */ public interface IBuildRobot { /** 建造头 */ public void buildHead(); /** 建造身体 */ public void buildBody(); /** 建造手 */ public void buildHand(); /** 建造脚 */ public void buildFoot(); /** 获取机器人结果 */ public Robot getRobotResult(); }
package com.lw.designpattern.builder; /** * @Classname DanceRobotBuilder * @Description 建造跳舞机器人 * @Author lw * @Date 2019-12-25 08:43 */ public class DanceRobotBuilder implements IBuildRobot { private Robot robot; public DanceRobotBuilder(){ robot = new Robot(); } @Override public void buildHead() { robot.setHead("写入机械舞程序"); } @Override public void buildBody() { robot.setBody("钛合金身体"); } @Override public void buildHand() { robot.setHand("钛合金手"); } @Override public void buildFoot() { robot.setFoot("钛合金脚"); } @Override public Robot getRobotResult() { return robot; } }
package com.lw.designpattern.builder; /** * @Classname Director * @Description 指挥官 * @Author lw * @Date 2019-12-25 08:45 */ public class Director { public Robot createRobotByDirecotr(IBuildRobot ibr){ ibr.buildBody(); ibr.buildFoot(); ibr.buildHand(); ibr.buildHead(); return ibr.getRobotResult(); } }
/** * 建造者模式 */ @Test public void testBuilder(){ Director director = new Director(); Robot robot = director.createRobotByDirecotr(new DanceRobotBuilder()); System.out.println(robot.getHead()); System.out.println(robot.getBody()); System.out.println(robot.getHand()); System.out.println(robot.getFoot()); System.out.println("机器人创建成功!!!"); }
打印结果
5.模式的应用场景
建造者模式创建的是复杂对象,其产品的各个部分经常面临着剧烈的变化,但将它们组合在一起的算法却相对稳定,所以它通常在以下场合使用。
6.扩展,开源框架Mybatis中建造者模式的应用
1. Mybatis中用到的建造者模式:
SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder等。
2. 举个读Mybatis源码的例子:
XMLConfigBuilder读取配置文件构建出Configuration对象,然后SqlSessionFactoryBuilder使用Configuration对象作为参数,构建出SqlSessionFactory对象。
3. 分析原因
这么做的原因是Mybatis的初始化工作较复杂,不是一个构造函数就能包括的。所以采用了分层构建方法。例如Mybatis中极其重要的Configuration对象,它庞大且复杂,初始化比较麻烦,所以使用专门的建造者XMLConfigBuilder进行构建。
原文:https://www.cnblogs.com/lwcode6/p/12094792.html