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

概述

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

相关文章

来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4064
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5476
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

6828
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

25310
来自专栏跟着阿笨一起玩NET

c#实现打印功能

2772
来自专栏飞扬的花生

jsencrypt参数前端加密c#解密

      写程序时一般是通过form表单或者ajax方式将参数提交到服务器进行验证,如何防止提交的请求不被抓包后串改,虽然无法说绝对安全却给非法提交提高了难度...

3869
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2645
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4025
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2536
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4868

扫码关注云+社区