java开发建造者模式验证实例详解

 更新时间:2021年10月12日 14:15:50   作者:guoyp2126  
这篇文章主要为大家介绍了java开发中建造者模式的验证实例详解,文中附含详细示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助

引言

创建一个类的实例,我们通常使用类中构造函数来完成对象的初始化,如果一个对象构造过程很复杂,如果将构造过程和对象使用的过程放在一起,就显得这个类很笨重,职责也不单一,最好的解决办法就是将构造过程拿出来单独进行封装,类的使用单独封装一个类就会好很多。如:mybaits中的SqlSessionFactoryBulider和SqlSessionFactory两个类,下图为SqlSessionFactoryBulider和SqlSessionFactory两个类提供的方法。前者职责是根据mybaits的配置文件(配置文件很复杂,构造过程更复杂)构造SqlSessionFactory实例对象,后者职责是SqlSessionFactory专注于的各种情况的下SqlSession的生成。

在这里插入图片描述

在这里插入图片描述

经典再现

建造者模式将对象的创建和对象的表示分开,使用同样的建造过程可以建造出不同的对象表示,一下我们使用计算机的生产过程为例,介绍建造者模式。计算机可以用来上网、办公、娱乐等这个是计算机这个对象本身要提供给我们的功能(我们可以称为对象表示) 我们称其为computer。其构造包括安装主板、安装CPU、安装硬盘、网卡等构造过程,我们称之为bulider,假设联想计算机和dell计算机具体的安装方法上有差别,因此我们有LenovoBulider和DellBulider两个具体的实现类,这个两个类及bulider更关注具体的建造方法,我们再封装一个类,调用这些建造方法完成完成产品的构建,就产生了我们经典的建造者模式。上例类图如下:

在这里插入图片描述

产品Computer 示例代码如下:

public class Computer {
    private String hardDisk ;
    private String CPU;
    private String mainboard ;

    public void setHardDisk(String hardDisk) {
        this.hardDisk = hardDisk;
    }
    public void setCPU(String CPU) {
        this.CPU = CPU;
    }
    public void setMainboard(String mainboard) {
        this.mainboard = mainboard;
    }

    public void start()
    {
        System.out.println(hardDisk+"  "+CPU+"   "+ mainboard +"    办公");
    }

    public void work()
    {
        System.out.println(hardDisk+"  "+CPU+"   "+ mainboard +"    办公");
    }

    public void play()
    {
        System.out.println(hardDisk+"  "+CPU+"   "+ mainboard +"    娱乐");
    }
}

抽象的建造者,把可变部分延迟到子类进行

public abstract class ComputerBulider {
    protected Computer acomputer = new Computer();

    public abstract void buildCPU();

    public abstract void buildHardDisk();

    public abstract void buildMainboard();

    //关键代码需要返回一个产品的对象
    public Computer getComputer(){
        return acomputer;
    }
}

两个具体的建造者,完成那些不同建造方法的具体实现,代码如下

public class DellBulider extends ComputerBulider {
    @Override
    public void buildCPU() {
        acomputer.setCPU("dell CPU");
    }

    @Override
    public void buildHardDisk() {
        acomputer.setHardDisk("dell 硬盘");
    }

    @Override
    public void buildMainboard() {
        acomputer.setMainboard("dell 主板");
    }
}

public class LenovoBulider extends ComputerBulider {
    @Override
    public void buildCPU() {
        acomputer.setCPU("联想 CPU");
    }

    @Override
    public void buildHardDisk() {
        acomputer.setHardDisk("联想 硬盘");
    }

    @Override
    public void buildMainboard() {
        acomputer.setMainboard("联想 主板");
    }
}

指挥者,总体包装师代码如下:

//指挥者,接收指令安排建造者根据一定的工序去制作产品
public class Director {
    private ComputerBulider computerBuilder;
    public Director(ComputerBulider comBuilder) {
        this.computerBuilder = comBuilder;
    }
    public Computer construct(){
        //安装主板
        computerBuilder.buildMainboard();
        //安装cpu
        computerBuilder.buildCPU();
        //安装硬盘
        computerBuilder.buildHardDisk();

        //准备完毕,返回一个完整的计算机给调用者
        return computerBuilder.getComputer();
    }
}

巧妙之处,在于通过构造注入的方式,将具体的建造者对象传入,按照流程化方式建造了一个完整的对象。
通过代码我们可以想象如果要生产一台华硕计算机,我们只需要扩展一个华硕的具体bulider即可,原有的代码完全不用动,符合开闭原则。另外我们指挥者类中只出现抽象的bulider,具体bulider完全可以替换它,符合里氏替换原则。当然每个类各司其职,职责清晰,满足单一职责原则。

建造者模式优点及应用场景

优点:客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象;每一个具体建造者都相对独立,而与其他的具体建造者无关;可以更加精细地控制产品的创建过程。
应用场景:建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式

工厂方法模式和建造者模式区别

工厂方法模式输出的是产品;而建造者模式中的builder输出的是一个个零部件,再由指挥者进行包装形成产品。建造者模式更加关注与零件装配的顺序

拓展与总结

只要符合将对象的创建和对象的表示分离,就属于建造者模式。建造者模式在实际使用中有很多变种,如JDK中StringBulider及mybatis中SqlSessionFactoryBulider,就没有指挥者,但是也隶属于建造模式,在使用过程中需要我们根据概念活学活用。在实际开发中,建造者模式又经常和工厂模式结合使用。

以上就是java开发建造者模式验证实例详解的详细内容,更多关于java建造者模式验证的资料请关注脚本之家其它相关文章!

相关文章

  • java递归设置层级菜单的实现

    java递归设置层级菜单的实现

    本文主要介绍了java递归设置层级菜单的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • SpringBoot validator参数验证restful自定义错误码响应方式

    SpringBoot validator参数验证restful自定义错误码响应方式

    这篇文章主要介绍了SpringBoot validator参数验证restful自定义错误码响应方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java中的类初始化解析

    Java中的类初始化解析

    这篇文章主要介绍了Java中的类初始化解析,类的初始化是一个Java类生命周期中的其中一个阶段,初始化是类加载的最后一个阶段,也正是在初始化阶段,才会真正开始执行类中所写的Java代码,需要的朋友可以参考下
    2023-08-08
  • Java权重随机的实现方法

    Java权重随机的实现方法

    这篇文章主要介绍了Java权重随机的实现方法,实例分析了权重随机算法的原理与完整实现方法,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • java 如何读取远程主机文件

    java 如何读取远程主机文件

    这篇文章主要介绍了java 如何读取远程主机文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Spring MVC中使用Google kaptcha验证码的方法详解

    Spring MVC中使用Google kaptcha验证码的方法详解

    kaptcha 是一个非常实用的验证码生成工具。有了它,你可以生成各种样式的验证码,因为它是可配置的,下面这篇文章主要给大家介绍了关于Spring MVC中使用Google kaptcha验证码的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-10-10
  • 详解Quartz 与 Spring框架集成的三种方式

    详解Quartz 与 Spring框架集成的三种方式

    这篇文章主要介绍了详解Quartz 与 Spring框架集成的三种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Java并发编程之Volatile变量详解分析

    Java并发编程之Volatile变量详解分析

    Volatile关键字是Java提供的一种轻量级的同步机制,本篇文章深入浅出的讲讲Java并发编程的Volatile,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-10-10
  • Java实现动态规划背包问题

    Java实现动态规划背包问题

    本文主要介绍使用java实现动态规划的背包问题,详细使用图文和多种案例进行解析,帮助理解该算法
    2021-06-06
  • 解决idea spring boot 修改html等不重启即时生效的问题

    解决idea spring boot 修改html等不重启即时生效的问题

    这篇文章主要介绍了解决idea spring boot 修改html等不重启即时生效的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论