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

概述

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

相关文章

来自专栏程序员的酒和故事

跟Google学写代码--Chromium工程中用到的C++11特性

Ttile 跟Google学写代码--Chromium工程中用到的C++11特性 Chromium是一个伟大的、庞大的开源工程,很多值得我们学习的地方。 《跟...

3874
来自专栏java一日一条

java设计模式-观察者模式

基本概念:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己...

792
来自专栏ImportSource

五分钟了解Java10针对垃圾收集的改进

Java10 已经发布了大概有一个多月了。我们在之前的文中介绍过10为我们带来的一些新特性:JDK10要来了:下一代 Java 有哪些新特性?。其中就提到了10...

31810
来自专栏Java技术栈

Java 10的10个新特性,将彻底改变你写代码的方式!

Java 9才发布几个月,很多玩意都没整明白,现在Java 10又要来了。。 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JD...

3988
来自专栏腾讯大讲堂的专栏

设计模式笔记

| 导语 “计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决” “Any problem in computer science can be so...

4368
来自专栏撸码那些事

【封装那些事】 不充分的封装

以汽车为例,我们并不需要了解发动机的原理就可以开车。这准确描绘了封装原则的作用:用户无需知道抽象(汽车)的细节,此外,封装原则还让抽象能够隐藏实现细节的变化。发...

46913
来自专栏大闲人柴毛毛

三分钟理解“简单工厂模式”——设计模式轻松掌握

实际问题: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。 普...

34712
来自专栏韩伟的专栏

基于对象和面向对象

“基于对象”是“面向对象”一次动态化变迁,它依赖于现代语言的动态特性,让方法和属性统一起来;用组合取代继承;以函数对象查找取代多态的方法调用。这些变化让面向对象...

1.1K0
来自专栏Java技术栈

Java 编程中关于异常处理的 10 个最佳实践

异常处理是Java 开发中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等。Java提供了...

1364
来自专栏企鹅号快讯

C+虚函数实现多态性的思考

相信这篇文字已经被这个晦涩的标题直接给PASS了,但笔者想把这些晦涩的概念说的生动些,C++和Python在编程思想上有很多是一致的,比如面向对象的思想,面向对...

18210

扫码关注云+社区