常用设计模式(一)Builder(构建者)模式

本文介绍了Builder设计模式,并通过对比构造函数和setter方法的方式,展示了在面对大量属性时如何使用Builder模式来简化对象创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Builder(构建者)模式


最近有点其他的事情,有一段时间没有更新博客了,本来打算昨天更新的,但是昨天S7的比赛看得太过投入就没来的及更新,首先还是要恭喜一下RNG成功晋级四强,哈哈哈,多年不打游戏了但是比赛还是看得很激情。接下来就进入我们今天的正题,给大家介绍一个我们开发中经常遇到的设计模式——Builder(构建者)模式。

大家在开发调用各种API的时候,相信大家都遇到过这样的代码(老哥是做Android开发的,所以例子是Android的sdk中的AlertDialog代码),比如Android中我们想要创建一个dialog那我们需要用到以下这样的代码:

 AlertDialog dialog=new AlertDialog.Builder(this)
                .setCancelable(false)
                .setIcon(this.getDrawable(R.mipmap.ic_launcher))
                .setCancelable(false)
                .setMessage("Hello World")
                .create();


同样我们使用的很多的功能很强大的网络请求框架okhttp中也有这样的代码:

OkHttpClient okHttpClient =new OkHttpClient.Builder()
                .addInterceptor()
                .addNetworkInterceptor()
                .cache()
                .cookieJar()
                .build();


以上的这两种形式的代码就是使用了Builder模式的代码,观察我们可以发现在Builder模式下,我们不是直接去new对应的类去得到类的实例,而是去通过new Builder()通过builder的build方法去创建类的实例。那么接下来我们就详细讲解一下这种模式的好处:

首先我们假如有个属性很多Person类:

/*
 * @author zhengzhong on 2017/10/21.
 *         email zheng_zhong@163.com
 * @version V1.0.0
 */

public class Person {
    private String name;
    private int gander;
    private int age;
    private String address;
    ......
    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int gander) {
        this.name = name;
        this.gander = gander;
    }

    public Person(String name, int gander, int age) {
        this.name = name;
        this.gander = gander;
        this.age = age;
    }


    public Person(String name, int gander, int age, String address) {
        this.name = name;
        this.gander = gander;
        this.age = age;
        this.address = address;
    }

 ......
}


可以看到当Person有很多的属性时,类的构造函数就会很复杂,当我们new对象时,代码如下:

Person p =new Person(name, gander, age, address,......)


当类的属性过多,这样我们就需要重载很多构造方法,构造方法在参数很多的情况下难以分清某个位置具体参数代表的意义,比如我们Person中有两个参数的类型相同。同时也不便于阅读。那有的老哥可能会说我们可以用setter方法啊,是的我们当然可以使用setter方法,那我们接下来看看使用setter方法的代码:

 Person person =new Person();
 person.setName("张三");
 person.setAge(20);
 person.setGander(1);
 person.setAddress("bj");
 ......


可以看到我们使用setter方法一个一个的去设置对象的属性,但是这样去设置很产生很多重复代码,而且这样去罗列设置属性看起来比较乱、可读性差。

当类的属性过多时,以上的这些问题会越发的明显,基于这种情况下,我们今天要讲解的Builder模式就很重要了。

那么我们接下来看看Builder模式下代码该如何写:

/**
 * @author zhengzhong on 2017/10/21.
 *         email zheng_zhong@163.com
 * @version V1.0.0
 */

public class Person {

    private String name;
    private int gander;
    private int age;
    private String address;

    private Person(String name, int gander, int age, String address) {
        this.name = name;
        this.gander = gander;
        this.age = age;
        this.address = address;
    }

    public static class Builder {
        private String name;
        private int gander;
        private int age;
        private String address;

        public Builder() {
        }

        public Builder addName(String name) {
            this.name = name;
            return this;
        }

        public Builder addGander(int gander) {
            this.gander = gander;
            return this;
        }

        public Builder addAge(int age) {
            this.age = age;
            return this;
        }

        public Builder addAddress(String address) {
            this.address = address;
            return this;
        }

        public Person build() {
            return new Person(name, gander, age, address);
        }
    }
}


那么在Builder模式下,我们就可以通过Builder去创建Person 对象,当类的属性很多时,这种方式创建对象和上面两种方式对比,优势很明显。Builder模式下代码如下:

 Person person =new Person.Builder()
                .addName("张三")
                .addGander(1)
                .addAge(20)
                .addAddress("bj")
                .build();


有关Builder模式的介绍大致就是这样了,相信各位初次接触这个模式老哥也有了一定的了解。如有什么疑问欢迎大家留言指正。祝各位生活愉快!

这里写图片描述

最后欢迎对Android开发感兴趣的老哥一起讨论。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值