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

概述

建造者模式又称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 条评论
登录 后参与评论

相关文章

来自专栏腾讯IVWEB团队的专栏

响应式编程中 Stream 对象的实现原理

这篇文章介绍一种编程泛型,叫做响应式编程。将响应式称作“编程泛型”可能有些夸大其作用范畴,不过通过引入响应式确实会改变我们对特定问题的思考方法,就像刚接触red...

5540
来自专栏偏前端工程师的驿站

JS魔法堂:不完全国际化&本地化手册 之 理論篇

前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求——国际化&本地化。熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"...

2338
来自专栏GIS讲堂

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

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

2941
来自专栏Phoenix的Android之旅

工厂模式之抽象工厂

然后挖了个坑…没有说 Abstract Factory,主要是因为这两种模式之间相似度比较高, 一起讲容易混淆,所以就另起一篇来说了。

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

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

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

1804
来自专栏京东技术

京东资深架构师代码评审歪诗

2033
来自专栏阿凯的Excel

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

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

3719
来自专栏码农分享

适配器模式(Adapter)

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

1271
来自专栏郭霖

Ruby设计模式透析之 —— 策略(Strategy)

Java设计模式透析之 —— 策略(Strategy) 今天你的leader兴致冲冲地找到你,希望你可以帮他一个小忙,他现在急着要去开会。要帮什么忙呢?你很好...

2236
来自专栏积累沉淀

Java设计模式(六)----适配器模式

适配器模式 1、概述 2、适配器模式的用途 3、模式中的角色 4、实现方式 5、类适配器和对象适配器的权衡 6、缺省适配模式 1、概述  适...

2498

扫码关注云+社区

领取腾讯云代金券