关于建造者模式(builder模式)学习心得

前言

如果你还对builder模式一无所知,还不知道如何去使用的话,我想我这篇文章能够带你对这个模式有一个基础的认识.本文仅针对建造者模式的初学者分享.高手可以自行绕道.相信大家一定在平常编写代码的时候,遇到过builder模式,因为这个模式用起来非常简洁.几乎可以一句代码搞定需要设置的参数, 得到一个实例.大大的方便了使用者编写代码的速度.相信用过比较流行的网络框架,图片加载框架的童鞋,一定用过.好了,下面我和大家一起分享我学习的经验.

学习这个模式的目的:

学习之前,还是搞懂为什么要学这个模式?这个模式的作用是什么?
下面我举一个非常简单的例子,比如我需要创建一个Person对象,这个person对象中,我有很多个参数,比如:

    private int id;
    private String name;
    private int age;
    private String birthday;
    private String gender;
    private double height;
    private double weight;

如果我要一次性设置这么多的属性给person,你会不会发现是不是每一次都需要

p1.setName(xxx);
p1.setAge(xxx);
~~~

目前可能就只有这么几个参数还好,如果参数多起来了呢?是不是感觉写的很烦?
因为我们学习builder可以为我们减少一些代码量.增加开发速度.
当然builder模式的作用不仅仅是在此,它还可以结合单利模式进行使用,对同一个对象的多个属性进行赋值.
但作为初学者学习,建议还是先把基础的知识学好,然后自己可以继续深入研究混合模式开发哦!
下面我们来正式开始学习吧!

进入正题(学习builder模式):

我先给大家写一个完成建造者模式之后的写法,好让大家有个对比

 Person person = new Person.PersonBuilder(1231)
                .setName("张三")
                .setAge(12)
                .setBirthday("1998-01-04")
                .setHeight(175)
                .setGender("man")
                .setWeight(60)
                 .build();

大家其实可以观察一下,为什么可以连续去设置多个属性呢?是因为每次返回的都是同一个对象,那么底层做了什么逻辑呢?下面我贴出我的代码:


public class Person {
    private int id;
    private String name;
    private int age;
    private String birthday;
    private String gender;
    private double height;
    private double weight;


    private Person(PersonBuilder builder) {
        this.id = builder.id;
        this.name = builder.name;
        this.age = builder.age;
        this.birthday = builder.birthday;
        this.gender = builder.gender;
        this.height = builder.height;
        this.weight = builder.weight;

    }


    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public String getBirthday() {
        return birthday;
    }

    public String getGender() {
        return gender;
    }

    public double getHeight() {
        return height;
    }

    public double getWeight() {
        return weight;
    }


    public static class PersonBuilder {

        private final int id;
        private String name;
        private int age;
        private String birthday;
        private String gender;
        private double height;
        private double weight;

        public PersonBuilder(int id) {
            this.id = id;
        }

        public PersonBuilder setName(String name) {
            this.name = name;
            return this;
        }

        public PersonBuilder setAge(int age) {
            this.age = age;
            return this;
        }

        public PersonBuilder setBirthday(String birthday) {
            this.birthday = birthday;
            return this;
        }

        public PersonBuilder setGender(String gender) {
            this.gender = gender;
            return this;
        }

        public PersonBuilder setHeight(double height) {
            this.height = height;
            return this;
        }

        public PersonBuilder setWeight(double weight) {
            this.weight = weight;
            return this;
        }

        public Person build() {
            return new Person(this);
        }
    }
}

下面我给大家讲解一下,为什么要这么写?
首先我们肯定是要把需要创建那个对象空参构造方法给私有的!以便提供给PersonBuilder类使用.我们所有设置属性的操作都是操作PersonBuilder,而不是直接操作Person,所以呢?我们需要在PersonBuilder类中创建与Person类中相同字段,操作了PersonBuilder类的属性,间接的操作了Person类的属性.而要同时达到返回的是同一个对象的话,在每个设置属性的方法返回的肯定是同一个对象,那么我们所有的属性都设置好了,就可以了么?
肯定不行的,因为你现在还没有和Person类进行关联,所有还无法达到我们想要的效果.就好比,你建房子,你把材料都准备好了,没有修建也是不行的.因此,我们需要在build方法中创建一个Person实现连接.

public Person build() {
            return new Person(this);
        }

这样我们的简单的builder就已经构造完成了.希望大家能够从我的文章获得收获.

最后感谢大家阅读本篇文章.!谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,395评论 25 707
  • 望雁栖湖的方向 有一群人在起舞 领舞的那位好美 我知道你来了! 从天上踏着彩云 带着你满满的爱 翩翩在怀柔的校园里...
    象天之性阅读 238评论 0 0
  • 学习新事物的方法论有三个阶段,分别是寻找方法论、修正方法论,以及遵循方法论。如果你能判断自己所在的领域,到底是方法...
    民哥_财富教练阅读 603评论 0 1