Android建造者模式(二、builder模式)

上篇讲解了单例模式 https://blog.csdn.net/lovelixue/article/details/81940996

现在来讲讲建造者模式

建造者模式的代码看起来有多舒服,这点我想对于一个开发来说,都是不言而喻的,以我用建造者模式做的一个demo来说

首先我新建一个Person类,有四种属性,这是普通类型的一个Person类

/**
 * 普通的模式
 * */
public class PersonTest {
    private String name;//姓名(如果必选则需要final)
    private int age;//年龄
    private String sex;//性别
    private String identity;//身份

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getIdentity() {
        return identity;
    }

    public void setIdentity(String identity) {
        this.identity = identity;
    }

当我们需要这个person对象并且给他set值的时候,我们需要这样做

        //普通模式获取PersonTest对象
        PersonTest personTest = new PersonTest();
        personTest.setName("候明天的雪");
        personTest.setAge(18);
        personTest.setSex("男");
        personTest.setIdentity("码农");

这样看上去就比较累赘了,还有一种情况是直接添加多个构造的,构造里面传参数,需要什么参数就添加对应的构造,这种我就不贴代码了,非常累赘不说,代码看上去就很low,合格的码农都不会如此吧

以上是普通模式,接下来就看建造者模式来拿对象

同样的我先新建一个Person类,类里面代码的解析我都添加了

/**
 * 建造者模式
 * 需要什么属性就拿什么属性,以这个Person为例,不需要创建N个构造方法,增加代码可读性
 * 最重要的是我们需要什么就点什么,开发起来身心愉悦
 * */
public class Person {
    private final String name;//姓名
    private final int age;//年龄
    private final String sex;//性别
    private final String identity;//身份

    private Person(PersonBuilder builder){
        this.name = builder.name;
        this.age = builder.age;
        this.sex = builder.sex;
        this.identity = builder.identity;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getSex() {
        return sex;
    }

    public String getIdentity() {
        return identity;
    }

    /**
     * 创建PersonBuilder
     * */
    public static class PersonBuilder{
        private final String name;//姓名(如果必选则需要final)
        private int age;//年龄
        private String sex;//性别
        private String identity;//身份

        /**
         * 因为name是必选,所以添加一个带参name的构造
         * */
        public PersonBuilder(String name){
            this.name = name;
        }

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

        public PersonBuilder setSex(String sex) {
            this.sex = sex;
            return this;
        }

        public PersonBuilder setIdentity(String identity) {
            this.identity = identity;
            return this;
        }

        //直接build返回person对象
        public Person build(){
            return new Person(this);
        }

        //添加限制条件再返回person对象
//        public Person build(){
//        //注意事项,先创建对象,再返回,因为PersonBuilder不是线程安全的,如果后创建对象,可能属性会被其他线程改变
//            Person person = new Person(this);
//            if (person.getAge()>100){
//                throw  new IllegalStateException("哥们,年龄这么大,你超神了");
//            }
//            return person;
//        }
    }

通过这个模式再来获取对象设值进去,来看看实现

        //通过builder创建一个Person对象
        Person person = new Person.PersonBuilder("候明天的雪")
                .setAge(18)
                .setSex("男")
                .setIdentity("码农")
                .build();

 这样看代码是不是很简洁,逼格也瞬间上去了,这里面也有几点是值得讲解下的

  • 用final修饰后,在构造里面就必须添加这个属性了,也就是说我们这个属性是必须的,在很多框架里面都有,比如glide的时候传入一个context之类的
  • set方法是在builder里面,get则是在外面
  • 返回对象的方式,可以直接返回一个Person对象,也可以加入条件(例如我注释掉的那部分代码)

好了,基本就这些了,当然这些知识基础的建造者模式实现,后面还有更多复杂而有趣的深层次内容等待我们探索

注意点:链式调用是一种写法,builder是一种模式,链式调用是builder里面的一种写法

链式调用是一种写法 builder是一种模式 ,一种是设计模式 一种相当于语法糖,就是说构造器模式的实现会使用链式调用的写法

贴上我的源码 https://github.com/sdgSnow/DesignPattern

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值