Java设计模式-建造者模式

文章介绍了在Java编程中,当创建复杂对象如Car时,如何利用建造者模式解决参数多且有特定组合要求的问题。对比了构造方法和set方法的不足,详细展示了建造者模式的实现方式,包括内部类Build的使用以及链式设置属性的方法,并强调了建造者模式完成后对象属性不可变的特点。
摘要由CSDN通过智能技术生成

简介

当一个复杂的对象装配时,所需要传入的参数比较多的时候,并且会根据不同的参数来装配对象,当参数不同时,装配的对象的内部也不同,可以使用过建造者模式来解决。

汽车类

public class Car {

    /** 雷达 */
    private String radar;

    /** 压力监控表 */
    private String monitor;

    /** 记录仪 */
    private String recorder;

    /** 倒车影像 */
    private String reversingImage;

    /** 工具箱 */
    private String toolBox;

    public Car(){

    }

    public Car(String radar, String monitor, String recorder, String reversingImage, String toolBox) {
        if(!((null == radar) ? (null == reversingImage) : (null != reversingImage))){
            throw new RuntimeException();
        }
        this.monitor = monitor;
        this.recorder = recorder;
        this.toolBox = toolBox;
    }

    public void setRadar(String radar) {
        if(null == reversingImage){
            throw new RuntimeException();
        }
        this.radar = radar;
    }

    public void setReversingImage(String reversingImage) {
        if(null == radar){
            throw new RuntimeException();
        }
        this.reversingImage = reversingImage;
    }

    public void setMonitor(String monitor) {
        this.monitor = monitor;
    }

    public void setRecorder(String recorder) {
        this.recorder = recorder;
    }

    public void setToolBox(String toolBox) {
        this.toolBox = toolBox;
    }
}
复制代码

构造方法模式

public void build(){
    Car car = new Car(null,"1","1",null,"1");
}
复制代码

当我们在购买汽车的时候,需要选配一些配置的时候,并且雷达和倒车影像是需要同时选择的,不能单独选配,此时就需要在构造方法中进行参数的校验,如果说构造方法中的参数比较多的时候,但是汽车中有一些配置我们并不想要,此时就需要在构造方法中传递null,此时构造方法中一些不必要的参数都需要传递就比较麻烦。

set方法模式

public void build(){
    Car car = new Car();
    car.setMonitor("1");
    car.setRecorder("1");
}
复制代码

set方法模式下,如果说雷达和倒车影像是需要同时选择的,不能单独选配,此时你就会发现如果我先选雷达再选配倒车影像的时候,就会发现先选雷达的时候倒车影像没有选配,先选倒车影像的时候雷达没有选配,这样就会造成互相矛盾。

建造者模式

public class Car {

    private Car(Build build){

    }

      public static class Build {

        /** 雷达 */
        private String radar;

        /** 压力监控表 */
        private String monitor;

        /** 记录仪 */
        private String recorder;

        /** 倒车影像 */
        private String reversingImage;

        /** 工具箱 */
        private String toolBox;

        public Build setRadar(String radar) {
            this.radar = radar;
            return this;
        }

        public Build setMonitor(String monitor) {
            this.monitor = monitor;
            return this;
        }

        public Build setRecorder(String recorder) {
            this.recorder = recorder;
            return this;
        }

        public Build setReversingImage(String reversingImage) {
            this.reversingImage = reversingImage;
            return this;
        }

        public Build setToolBox(String toolBox) {
            this.toolBox = toolBox;
            return this;
        }

        public Car build(){
            if((null == radar) ? (null == reversingImage) : (null != reversingImage)){
                return new Car(this);
            }
            throw new RuntimeException();
        }

    }

}
复制代码

使用建造者模式的时候,我们需要在Car类中添加一个Build内部类,使用private修饰Car构造方法让其不能被外部访问,并且需要将Car类中的一些变量放置到Build类中,并且Build中的set方法需要返回当前Build对象,这样才能链式访问,最终Build中的build方法来校验参数并返回Car对象,当我们使用建造者模式来创建完对象之后,是不能再去改变Car内部中的一些属性的。

public void build(){
    Car car = new Car.Build().setMonitor("1").setToolBox("1").build();
}
复制代码

可以看到当使用建造者模式创建完对象之后,再去调用carset方法修改属性是不被允许的。

总结

建造者模式一般是在创建对象比较复杂的情况下使用,当创建对象比较简单的时候,我们可以用构造方法和set方法的方式来创建即可。

作者:历河川
链接:https://juejin.cn/post/7213285816492113978
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值