zoukankan      html  css  js  c++  java
  • JAVA设计模式之简单粗暴学建造者模式

    文章由浅入深,先用简单例子说明建造者,然后分析模式的优缺点,最后结合优秀开源框架Mybatis,说明该模式的用处。

    1、先定义一个机器人模型

    package com.jstao.model;
    
    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;
        }
    }

    这就是机器人模型,有头,有身体,有手,有脚。机器人都是由这个模型出来的。

    2、接下来定义一个造机器人的标准。一个把头、身体、手、脚造出来的标准。

    package com.jstao.service;
    
    import com.jstao.model.Robot;
    
    public interface IBuildRobot {
        public void buildHead();
        public void buildBody();
        public void buildHand();
        public void buildFoot();
        public Robot createRobot ();
    
    }

    这样,一个建造机器人的标准就定义好了。依次创建各个部位,最后调用createRobot方法就可以返回一个我们想要的机器人。

    3、现在机器人的模型和创建标准都有了,让我们来实现一个会跳舞的机器人。

    package com.jstao.service.impl;
    
    import com.jstao.model.Robot;
    import com.jstao.service.IBuildRobot;
    
    public class DanceRobotBuilder implements IBuildRobot {
        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 createRobot () {
            return robot;
        }
    
    }

    这个会跳机械舞的机器实现了IBuildRobot造机器人标准的接口,最后提供了createRobot方法返回robot实体。

    好的,其实到这里呢,我们已经完成了建造的过程。那就这么简单的建造过程,还搞了一个建造模式吗?非也。接下来,就是介绍建造者模式的精髓,那就是director。这个director呢,就是来执行我们刚才的造人动作的。没错,精髓就是我们刚才的造人动作。我们先看代码:

    4、指挥官Director

    public class Director {
        public Human createRobotByDirecotr(IBuildRobot ibr){
            ibr.buildBody();
            ibr.buildFoot();
            ibr.buildHand();
            ibr.buildHead(); 
            return ibr.createRobot ();
        }
    }

    建好了,这个Director类就跟个指挥官似,它有资源和工厂的。你跟它说要建造什么类型的机器人,只要传给它。它就给能你建造出来。

    我们来看下它是怎么造出来的:

    5、测试

    package com.jstao.main;
    
    import com.jstao.controller.Director;
    import com.jstao.model.Robot;
    import com.jstao.service.impl.DanceRobotBuilder;
    
    public class BuilderTest {
        public static void main(String[] args){
            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("机器人创建成功,恭喜!");
        } 
    }

    6、结果

    现在我们想要个会唱歌的机器人,就可以像跳舞机器人那样建好类。交给Director,它就可以给你建出来了。

    最后再来看下Builder模式的定义:“将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。“好理解点了吧。

     7、总结

    感受一下,建造者模式的好处有:

    1、  易于拓展。想要建唱歌机器人只要单独将这个类像跳舞人那样建好,交给Director就可以了。无需修改原有代码。符合“开闭原则”。

    2、  代码解耦,模块化,方便维护。产品本身与创建过程解耦,可以使用相同的创建过程得到不同的产品。

    短板有:使用范围有限。建造者模式创造出来的产品,其组成部分基本相同。如果产品之间的差异较大,则不适用这个模式。

     8、开源框架Mybatis中建造者模式的应用

    1、Mybatis中用到的建造者模式:

    SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder等

    2、举个我读Mybatis源码的例子:

    XMLConfigBuilder读取配置文件构建出Configuration对象,然后SqlSessionFactoryBuilder使用Configuration对象作为参数,构建出SqlSessionFactory对象。

    3、分析原因

    这么做的原因是Mybatis的初始化工作较复杂,不是一个构造函数就能包括的。所以采用了分层构建方法。例如Mybatis中极其重要的Configuration对象,它庞大且复杂,初始化比较麻烦,所以使用专门的建造者XMLConfigBuilder进行构建。

    9、我的其他设计模式

    (1)JAVA设计模式之观察者模式

    (2)JAVA设计模式之适配器模式

    (3)JAVA设计模式之策略模式

    你的支持是我的动力,最后笔记对你有用,别忘了点赞支持下哦。

  • 相关阅读:
    LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式
    第 15 篇:接口的单元测试
    【译】GitHub 为什么挂?官方的可行性报告为你解答
    微服务常用的几种部署方式——蓝绿部署,滚动升级,灰度发布/金丝雀发布
    .net生成PDF文件的几种方式
    读取私有字体信息并进行相关判断
    Windows Locale Codes
    总结C#获取当前路径的7种方法
    Devexpress aspxgridview oncustomcallback 无刷新更新数据
    ArcGIS Pro 版本、版本号、发布年代
  • 原文地址:https://www.cnblogs.com/luohanguo/p/10455745.html
Copyright © 2011-2022 走看看