设计模式二十四章经之建造者模式

概述

建造者模式又称Builder模式,它是一步步创建一个复杂的对象然后进行构建。可以精准的控制对象的构造过程。此模式是将构建复杂对象的过程与它的部件解耦,使得构建过程和部件的表示隔离开来。

一个对象有很多复杂的信息,比如人,有身高,体重,性别,姓名,年龄等等。如何将这些信息给组合起来,然后形成这个对象。比如男生很多,20岁的男生也很多。这个信息组成的过程很漫长。对于这种情况,构建过程中对外部影藏了具体如何实现的,使得组成过程中可以自由扩展,也就降低了两者的耦合度。

使用场景

1、相同的方法,不同的执行顺序,产生的结果不一样。

2、多个信息可以组装到一个对象中,但是产品的运行结果又不相同。

3、当初始化一个对象特别复杂的时候,且一些对象是有默认值的情况。

4、需要生成的对象内部属性本身相互依赖。

主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

具体实现

android内部使用的builder模式

这边上一个最常使用的例子,dialog:

private   void  showDialog(Context context) {  
        AlertDialog.Builder builder =  new  AlertDialog.Builder(context);  
        builder.setIcon(R.drawable.icon).setTitle( "Title" ).setMessage( "Message" ).setPositiveButton( "Button1" ,  
                 new  DialogInterface.OnClickListener() {  
                     public   void  onClick(DialogInterface dialog,  int  whichButton) {  
                        setTitle( "点击了对话框上的Button1" );  
                    }  
                }).setNeutralButton( "Button2" ,  
                 new  DialogInterface.OnClickListener() {  
                     public   void  onClick(DialogInterface dialog,  int  whichButton) {  
                        setTitle( "点击了对话框上的Button2" );  
                    }  
                }).setNegativeButton( "Button3" ,  
                 new  DialogInterface.OnClickListener() {  
                     public   void  onClick(DialogInterface dialog,  int  whichButton) {  
                        setTitle( "点击了对话框上的Button3" );  
                    }  
                });  
        builder.create().show();  // 构建AlertDialog, 并且显示
    } 

上述代码中,builder可以设置dialog的icon,title,message,button等信息。在调用create方法时,我们会将这些信息参数保存在dialog的AlertController中。这边源码的具体实现我们就不分析了。最后调用show方法将这个dialog显示出来。

自己撸一个builder模式

public class Test {
    public Set set() {
        return new Set();
    }
    public void overload(Set set) {
        set.textView.setText(set.age+":"+set.name+":"+set.value+".");
    }
    public class Set {
        private int age="18";
        private String name="我就是马云飞";
        private String value="男";
        private TextView textView;
        public Set setAge(int age) {
            this.age = age;
            return this;
        }
        public Set setName(String name) {
            this.name = name;
            return this;
        }
        public Set setValue(String value) {
            this.value = value;
            return this;
        }
        public Set setTextView(TextView textView) {
            this.textView = textView;
            return this;
        }
        public void over() {
            overload(this);
        }
    }
}

在Test这个类通过返回一个Set对象。Set方法中,每个返回本类实例的对象。最后通过over方法来调用Test的overload方法完成设置。

调用方法:

 test=new Test();
 test.set().setAge(18).setName("张三").setValue("男").setTextView(text).over();

输出结果:

18:张三:男

如果我们什么属性都没设置,那么输出结果如下:

18:我就是马云飞:男

总结

Builder模式在开发过程中也是比较常用的,比如目前比较流程的rxjava。比较常用的形式就是通过链式调用,让代码看起来通俗易懂。

优点:

  • 良好的封装性,容易扩展。
  • 可以控制内部的细节风险。

缺点:

  • 必须要有共同点,使用受限。
  • 内部复杂时,容易产生多余的builder对象。

最后

今晚一点google I/O的直播有人准备看吗?看的吱一声。

原文发布于微信公众号 - 我就是马云飞(coding_ma)

原文发表时间:2018-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android开发实战

设计模式-适配器模式

适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

1075
来自专栏进击的程序猿

The Clean Architecture in PHP 读书笔记(二)

设计模式是对软件中通用问题的总结,有了设计模式,方便我们进行交流,譬如一说MVC,我们就知道是怎么回事了,不然我们必须巴拉巴拉一大堆话去描述,不易于传播、交流,...

744
来自专栏GIS讲堂

常用公共服务接口与java调用实现

本节讲述日常生活中常用的一些公众服务的查询接口,其中包括天气查询,pm2.5情况查询,身份证查询、电话归属地查询,IP来源于地址查询等。

1851
来自专栏一名叫大蕉的程序员

简约的JAVA版本MapReduce和日常No.25

昨天做了一个小调查,说看看想看些啥。大概的分布是这样的,一个1代表一个投票。看来还是2、3比较多。 11111 希望看到"算法"回复1。 111...

1855
来自专栏码农分享

适配器模式(Adapter)

定义:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapp...

991
来自专栏猿人谷

map对象建立家族姓氏查询

题目:定义一个map对象,其元素的键是家族姓氏,而值是存储该家族孩子名字的vector对象。为这个map容器输入至少六个条目。通过基于家族姓氏的查询检测你的程序...

1848
来自专栏沈唁志

使用PHP实现数组的笛卡尔积来处理商品规格

在优化商城项目的时候,选择将商品的内容、规格、库存和价格分三个表来写。将多个规格的id合并存在一个字段中,按照从小到大的顺序来排列,使用逗号分隔

1162
来自专栏Java帮帮-微信公众号-技术文章全总结

【Java提高一】三大特性-封装

【Java提高】三大特性-封装 三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的...

3614
来自专栏阿凯的Excel

工资计算好帮手-Round函数必须有

现实中算工资的时候,或者财务报表的时候,难免会有一些小数。 由于我国不特殊的情况,最小单位是分,所以两位小数才有意义,第三位小数是毫无意义的,所以需要对数据进行...

3579
来自专栏游戏开发那些事

【Unity游戏开发】Lua中的os.date和os.time函数

  最近马三在工作中经常使用到了lua 中的 os.date( ) 和 os.time( )函数,不过使用的时候都是不得其解,一般都是看项目里面怎么用,然后我就...

1254

扫码关注云+社区