博主声明:

转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主 威威喵 原创,请多支持与指教。

本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/smile_running

今天我们来讲一讲在 Android 开发中最常用的设计模式 —— 建造者模式(Builder Pattern),这是一个变种了的建造者模式。

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

    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("120@qq.com").setJob("程序猿").build().log();Log.d(TAG, "" + xiaomingInfo);

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

是不是完全跟我们赋予他的值一模一样呢?

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

【设计模式】建造者模式相关推荐

  1. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  2. 说说设计模式~建造者模式(Builder)

    建造者模式是我的"设计模式"里创建型模式里的最后一篇,这种模式在实现中,很多架构都用到了,如MVC,MVP,MVVM,它们都是有建造者模式的精髓的,即,创建与表现分享,我们的MVC ...

  3. 设计模式 建造者模式_设计模式:建造者

    设计模式 建造者模式 有时需要在应用程序中创建一个复杂的对象. 一种解决方案是Factory模式,另一种是Builder设计模式. 在某些情况下,您甚至可以结合使用这两种模式. 但是在本文中,我想研究 ...

  4. 设计建造者模式java代码,Java设计模式-建造者模式

    定义 Separate the construction of a complex object from its representation so that the sameconstructio ...

  5. python创造者_python 设计模式-建造者模式

    问题:在上一篇python设计模式:抽象工厂模式中,我们尝试用抽象工厂模式规范化了 Pizza 原材料的供应以及 Pizza 的创建.但是我们忽略了一个问题,那就是每种 Pizza 的烘焙时间依赖于生 ...

  6. java设计模式-建造者模式

    概念:使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. ...

  7. 设计模式-建造者模式(转自:http://www.cnblogs.com/cbf4life/archive/2010/01/14/1647710.html)...

    11.1 变化是永恒的 又是一个周三,快要下班了,老大突然拉住我,喜滋滋地告诉我:"牛叉公司很满意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我们公司制作了,不过这次又额外增 ...

  8. 大话设计模式—建造者模式

    建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 一个 Builder 类会一步一步构造最 ...

  9. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

  10. Java常用设计模式————建造者模式

    引言 建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象.这种类型的设计模式属于建造型模式,它提供了一种创建对象的最佳方式. 一个Builder会一步步构建最终的 ...

最新文章

  1. @Value竟然能玩出这么多花样
  2. 隔空投送找不到_嗑技热点对标苹果AirDrop,安卓终于也能隔空投送
  3. 从思维导图学习操作系统(二)
  4. 设计模式理解:工厂模式,抽象工厂,原型方法
  5. Java 设计模式 Day2 之面向抽象原则:接口(interface)的设计应用与抽象类的区别
  6. Git简单命令 学习资源贴
  7. 什么是Maven快照(SNAPSHOT)
  8. Puppet 笔记 模板
  9. php是视频还是图片格式,php 视频、音频和图片文件上传,该如何解决
  10. Spring消息之STOMP
  11. python创建gui界面_你要的 Python 创建 GUI 用户界面程序,来咯
  12. 张小龙:微信背后的产品观
  13. fetch.php是什么意思,fetch什么意思
  14. 转一篇帖子-我是如何在网上卖鱼的
  15. Java-Swing内嵌网页判断网址类型
  16. 6.1 手机时钟系统简介
  17. 【RDMA】RDMA网卡通讯
  18. 怎么学习java?学习java的路线
  19. python 面向对象(五)约束 异常处理 MD5 日志处理
  20. 2022最新 Python和Pycharm官网下载安装

热门文章

  1. WeX5 APP发布及版本升级注意事项
  2. php 判断后缀名,PHP 文件类型判断代码
  3. lightdm 循环登录问题
  4. Kubernetes Pod报错 filed to get sandbox image “k8s.gcr.io/pause:3.6“
  5. hexo next主题去掉码市的Coding Pages等待页
  6. KylinV10上qt5.9开发应用打包步骤(四)--linuxdeployqt源码编译
  7. 如何进行网站防篡改监控
  8. IntelliJ IDEA 配置Jetty启动项目
  9. 微信小程序 -- 数据库数据excel文件批量导入
  10. CSS元素总结及HTML布局