设计模式之建造者模式

2023-08-10 15:48:57 浏览数 (2)

首先是他的重要性,在effective-java中第二条就建议使用建造者模式,在23种设计模式中,他是一个生产模式,定位十分准确,使用这种模式可以让我们更好的创建一个类,适合什么时候使用,构造方法参数多余四个以及将来可能扩展到四个的时候,生产的时候务必考虑到将来的扩展性,如果初期使用了工厂模式来生产,后期参数增加需要修改,会让工厂模式变得十分尴尬。 其原理是充分利用了java得特性以及语法,建造者模式核心就是this关键字以及内部类,接下来就由一个例子来说明吧,如果我们要创建一个People类,有name,age,weight,height或者更多得属性,如果直接用四个参数得构造方法是非常头疼得,我们需要知道这四个构造参数得顺序以及意义,在开发得时候有代码提示或许好一点,但是维护得时候需要阅读大量代码就非常致命了,回到Buider模式, 和普通类得区别是,我们需要一个public static final修饰得Buider内部类,public是为了People类能访问到,静态是为了不用声明内部类,final修饰是为了保证不可变,(老实说,作者此处也没具体注意到final得作用,只明白static final是一种常见甚至是必须得修饰),Buider类也需要和People一样得私有属性,给每一个属性添加一个类似set方法得方法,命名直接是属性名即可,参数名统一使用val,返回类型是Builder,我们直接返回this即可最后需要一个返回类型是People,参数是Builder无参构造方法,return new People(this),此处this就是这个内部类,细心得读者可能发现了People类并没有这个方法,于是我们需要给People添加一个参数是Builder的构造方法,直接将Build的属性赋值给People类,此时完成了建造者模式,达到链式编程的目的。 内部类方法参数使用val是为了和其他区分,是一种良好的编程习惯,final修饰内部类或许是保证了每个赋值方法返回的this是同一个this吧 完整代码如下:这只是一个示例,在具体使用中可灵活变换,比如在外部类使用带参构造先赋值两个参数

代码语言:javascript复制
package com.yizhi.practice.design;

/**
 * @Author: Zing
 * @Date: 2022/09/13/18:01
 * @Description:
 */
public class MyBuilder {
    public static void main(String[] args) {
        People people = new People.Builder()
                .age(10)
                .height(180)
                .weight(800)
                .name("张三").build();

    }
}

class People{
    private Integer age;
    private Integer weight;
    private Integer height;
    private String name;

    //内部类
    public static final class Builder{
        private Integer age;
        private Integer weight;
        private Integer height;
        private String name;

        //赋值方法
        public Builder age(Integer val){
            age = val;
            return this;
        }
        public Builder weight(Integer val){
            weight = val;
            return this;
        }
        public Builder height(Integer val){
            height = val;
            return this;
        }
        public Builder name(String val){
            name = val;
            return this;
        }

        //使内部类和外部类高内聚
        public People build(){
            return new People(this);
        }
    }

    //通过内部类为外部内赋值
    public People(Builder builder){
        age = builder.age;
        name = builder.name;
        weight = builder.weight;
        height = builder.height;
    }
}

0 人点赞