Android设计模式之建造者模式 —— Builder Pattern

· 背景

今天我们来讲一讲在Android开发中最常用的设计模式 —— 建造者模式

    设计模式有很多种,比如单例模式、建造者模式、适配器模式等等,在日常开发中适当的使用设计模式能更好的体现出我们对一款软件整体的架构思想。今天我们说的是建造者模式,要说何为建造者模式呢?不妨我们先看一段代码事先了解一下。

    private void dialog() {
        final TextView view = new TextView(this);
        view.setText("建造者模式");
        final AlertDialog dialog = new AlertDialog.Builder(this)
                .setIcon(R.mipmap.ic_launcher)
                .setTitle("i am dialog")
                .setMessage("test")
                .setView(view)
                .create();
        dialog.show();
    }

    相信大家对上面几行代码已经烂熟于心了吧,那么这便是我们最常用的对话框的调用方式。相信大家在调用我们系统api时都感觉很舒服,就像上面代码片段,简直如丝般顺滑!是的,我们的AlertDialog就是使用了标准的建造者模式。

    那么今天,我就来教大家学习一下我们的这种链式调用,保证让你的代码眼前一亮。

· 代码分析

    请我们的主角:小明上场!

/**
 * @Created by xww.
 * @Creation time 2018/8/3.
 */

public class XiaoMing {
    private final String GENDER;
    private final int AGE;
    private final int HEIGHT;
    private final int WEIGHT;
    private final String CONTACT;
    private final String EMAIL;
    private final String JOB;

    public XiaoMing(String gender,
                    int age,
                    int height,
                    int weight,
                    String contact,
                    String email,
                    String job) {
        this.GENDER = gender;
        this.AGE = age;
        this.HEIGHT = height;
        this.WEIGHT = weight;
        this.CONTACT = contact;
        this.EMAIL = email;
        this.JOB = job;
    }

    public static XiaoMingBuilder Builder() {
        return new XiaoMingBuilder();
    }

    public String log() {
        StringBuilder builder = new StringBuilder();
        builder.append("姓名:小明\n");
        builder.append("性别:" + GENDER + "\n");
        builder.append("年龄:" + AGE + "\n");
        builder.append("身高:" + HEIGHT + "\n");
        builder.append("体重:" + WEIGHT + "\n");
        builder.append("联系方式:" + CONTACT + "\n");
        builder.append("电子邮箱:" + EMAIL + "\n");
        builder.append("职业:" + JOB + "\n");
        return builder.toString();
    }
}

首先,我们看一下我们的小明类:

小明有性别、年龄、身高、体重、联系方式、电子邮箱、职业等属性。

我们实例化一个小明对象,平常的你肯定 new XiaoMing(params...);

虽然,你也能实例化小明。但是,今天我们用一种更优雅的方式来实现!

且看我们的另一个类:小明父亲类

/**
 * @Created by xww.
 * @Creation time 2018/8/3.
 */

public class XiaoMingBuilder {
    private String mGender;
    private int mAge;
    private int mHeight;
    private int mWeight;
    private String mContact;
    private String mEmail;
    private String mJob;

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

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

    public XiaoMingBuilder setHeight(int height) {
        this.mHeight = height;
        return this;
    }

    public XiaoMingBuilder setWeight(int weight) {
        this.mWeight = weight;
        return this;
    }

    public XiaoMingBuilder setContact(String contact) {
        this.mContact = contact;
        return this;
    }

    public XiaoMingBuilder setEmail(String email) {
        this.mEmail = email;
        return this;
    }

    public XiaoMingBuilder setJob(String job) {
        this.mJob = job;
        return this;
    }

    public XiaoMing build() {
        return new XiaoMing(
                mGender,
                mAge,
                mHeight,
                mWeight,
                mContact,
                mEmail,
                mJob
        );
    }
}

    为什么说这是小明父亲呢?因为就是它建造出小明的,当然你也可以认为是小明母亲,这都不是事!不要小王老王就好了,那样太乱了,哈哈。

注意理解我们的代码,为什么XiaoMingBuilder类要这么写,这么写有什么好处?自己可以脑补一下它的调用方式

· 这样写的理由

    注意看我们的小明类的属性,有性别、年龄、身高等等,虽然我只写了这么多,但是小明的属性可以有很多很多,比如:头发、衣服、鞋子、手机牌子什么鬼的一大堆,天知道还有多少。

那么,我们构造器就得写很多很多,例如这样的:

    public XiaoMing(String GENDER) {
        this.GENDER = GENDER;
    }

    public XiaoMing(String GENDER, int AGE) {
        this.GENDER = GENDER;
        this.AGE = AGE;
    }

    public XiaoMing(String GENDER, int AGE, int HEIGHT) {
        this.GENDER = GENDER;
        this.AGE = AGE;
        this.HEIGHT = HEIGHT;
    }

    public XiaoMing(String GENDER, int AGE, int HEIGHT, int WEIGHT, String CONTACT, String EMAIL) {
        this.GENDER = GENDER;
        this.AGE = AGE;
        this.HEIGHT = HEIGHT;
        this.WEIGHT = WEIGHT;
        this.CONTACT = CONTACT;
        this.EMAIL = EMAIL;
    }

    因为我们根本不确定小明到底有哪一些已经的属性,可能只知道小明的性别,也可能只知道小明的年龄和身高。这样写你不嫌累啊?

· 如何调用

    所以,以我们的小明为例子,我们引入建造者模式,我们的代码就变得非常精炼、明确。我们需要什么属性,就给他什么属性。看一下我们的调用方式吧。

        String xiaomingInfo = XiaoMing.Builder()
                .setGender("男")
                .setAge(20)
                .setHeight(175)
                .setWeight(55)
                .setContact("12345")
                .setEmail("[email protected]")
                .setJob("程序猿")
                .build()
                .log();
        Log.d(TAG, "" + xiaomingInfo);

    是不是觉得如丝般顺滑呢?为了验证我们参数是否真的赋予小明,我还特地Log了小明的属性方法。看我们的logcat输出就知道了

是不是完全跟我们赋予他的值一模一样呢?是吧,没错吧!

    好的设计模式我们也得适当的使用,不能一抓来就是一个建造者,一抓来又是一个单例。我们要深入体会和理解我们的设计模式,避免陷入过度设计。合理的运用能让我们的代码更加茁壮!

<声明>如有转载请附加原文链接:https://blog.csdn.net/smile_Running/article/details/81393180

猜你喜欢

转载自blog.csdn.net/smile_Running/article/details/81393180