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

时间:2022-06-01
本文章向大家介绍设计模式二十四章经之建造者模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

概述

建造者模式又称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的直播有人准备看吗?看的吱一声。