文档章节

设计模式-3-建造者模式(Builder Pattern)

iSnowFlake
 iSnowFlake
发布于 2015/12/22 12:49
字数 842
阅读 50
收藏 1

建造者模式(Builder Pattern) ,将一个复杂对象的构建和它的表示分离,使得同样的创建过程可以创建不同的表示。在Android 中也是非常的常见的,比如:

 /**
  * 给宝贝拨打电话
  * 
  * @param no
  */
 private void CallBaby() {
  new AlertDialog.Builder(getActivity())   
  .setTitle(R.string.call_baby)  
  .setMessage(R.string.call_baby_tips)  
  .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
   @Override
   public void onClick(DialogInterface arg0, int arg1) {
    Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+babyListBean.getFullPhone()));  
    startActivity(intent);  
   }
  })  
  .setNegativeButton(R.string.no, null)  
  .show(); 
 }

AlertDialog 的Builder通过setTitle(),setMessage(),setxxButton等方法在create()中构造出一个   AlertDialogInstance对象。然后客户可以把把AlertDialogInstance对象show出去。UML 表示如下:

 

《Effective Java》P9 第二条:遇到多个构造器参数时候要考虑用构造器(为了对比又要设计工厂方法)

使用Builder模式来替代多参数构造函数是一个比较好的实践法则。

 

我们常常会面临编写一个这样的实现类(假设类名叫MemberContact,是关于会员资料的),这个类拥有多个构造函数,

MemberContact(String name,String phone);

MemberContact(String name, String phone,int age);

MemberContact(String name, String phone,int age, String address);

MemberContact(String name, String phone,int age, String address, int cardID);

MemberContact(String name, String phone,int age, String address, int cardID, type ...);

这样一系列的构造函数主要目的就是为了提供更多的客户调用选择,以处理不同的构造请求。这种方法很常见,也很有效力,但是它的缺点也很多。类的作者不得不书写多种参数组合的构造函数,而且其中还需要设置默认参数值,这是一个需要细心而又枯燥的工作。

其次,这样的构造函数灵活性也不高,而且在调用时你不得不提供一些没有意义的参数值,例如,MemberContact("Anylife","10086" ,-1),显然年龄为负数没有意义,但是你又不的不这样做,得以符合Java的规范。如果这样的代码发布后,后面的维护者就会很头痛,因为他根本不知道这个-1是什么含义。对于这样的情况,就非常适合使用Builder模式。Builder模式的要点就是通过一个代理来完成对象的构建过程。这个代理职责就是完成构建的各个步骤,同时它也是易扩展的。下面是改写自Effective Java里面的一段代码:

 

/**
 * 
 * 
 * @author Anylife.zlb@gmail.com
 *
 */
public class MemberContact {
    private final String name;
    private final String phone;   //一个会员的姓名和电话号码是必填项目
    private final int    age;
    private final int    safeID;
    private final String address;
//  private final type   params...
    /**
     * 私有构造方法,在class Builder 中完成Build 后            
     * return new DoDoContact(Builder instance);
     * 有点代理的感觉哈
     * 
     * @param b
     */
    private MemberContact(Builder b) {
        age = b.age;
        safeID = b.safeID;
        name = b.name;
        address = b.address;
        phone = b.phone;
    }
    
    
//    public int getAge() {
//        return age;
//    }
// 
//    public int getSafeID() {
//        return safeID;
//    }
// 
//    public String getName() {
//        return name;
//    }
// 
//    public String getAddress() {
//        return address;
//    }
   
    public static class Builder {
        private String name    = null;
        private String phone = null;
        
        private int    age     = 0;
        private int    safeID  = 0;
        private String address = null;
        public MemberContact build() { // 构建,返回一个新对象
            return new MemberContact(this);
        } 
        
        public Builder(String name,String phone) {
            this.name = name;//这两个是必填的参数
             this.phone=phone;

        }
        
        public Builder phone(String val) {
         phone = val;
            return this;
        }
 
        public Builder age(int val) {
            age = val;
            return this;
        }
 
        public Builder safeID(int val) {
            safeID = val;
            return this;
        }
 
        public Builder address(String val) {
            address = val;
            return this;
        }
 
    }
}

 

 随心所欲的调用:
//    MemberContact mc1 = new MemberContact.Builder("who").phone(110).address("shenzhen").build();

//    MemberContact mc2 = new MemberContact.Builder("anylife").phone(1882656).age(10).address("beijing").build();

 

 

© 著作权归作者所有

iSnowFlake
粉丝 34
博文 93
码字总数 53328
作品 0
深圳
高级程序员
私信 提问
设计模式(Swift) - 3.观察者模式、建造者模式

上一篇 设计模式(Swift) - 2.单例模式、备忘录模式和策略模式中讲了三种常见的设计模式. 单例模式: 限制了类的实例化,一个类只能实例化一个对象,所有对单例对象的引用都是指向了同一个对象....

Dariel
2018/07/01
0
0
设计模式快速学习(四)建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。将一个复杂的构建与其表示相分离,使...

微笑面对Life
2018/08/15
0
0
设计模式8——Builder设计模式

Builder建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就...

小米米儿小
2013/12/11
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
2018/04/09
0
0
Java设计模式系列一(前言)

说起设计模式,很多人都会觉得这个概念很熟悉,会想到单例模式、工厂模式等等,但是似乎又说不出来什么,说不上它的核心思想和设计原则。其实我们的项目中,为了代码复用,增加可维护性,很多...

Mooree
04/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker百万连接设置相关资料

借助Docker单机秒开数十万TCP连接

youngjdong
5分钟前
0
0
这可能是史上最全 Redis 高可用解决方案总结

本文主要针对 Redis 常见的几种使用方式及其优缺点展开分析。 一、常见使用方式 Redis 的几种常见使用方式包括: 1.Redis 单副本; 2.Redis 多副本(主从); 3.Redis Sentinel(哨兵); 4....

别打我会飞
8分钟前
0
0
Qt编写数据可视化大屏界面电子看板11-自定义控件

一、前言 说到自定义控件,我是感觉特别熟悉的几个字,本人亲自原创的自定义控件超过110个,都是来自各个行业的具体应用真实需求,而不是凭空捏造的,当然有几个小控件也有点凑数的嫌疑,在编...

飞扬青云
10分钟前
0
0
第二讲:编写UDP Socket小程序

1、编写服务器端代码 文件-->新建 新建一个控制台程序: 下面用的是一张旧图,只要点确认就可以了。 切换到FileView视图 编译、链接 StdAfx.cpp( 里面的代码不用修改) 编辑UDPServer.cpp文...

一匹狼工作室
11分钟前
1
0
android ------ 实现高德定位并获取相应信息 ( 最新版高德SDK 和 Android SDK版本)

Android开发项目时常常会遇到定位这个功能, 很久以前写过一篇了,官方也更新了一些东西,我也更新下 以前使用的是jar包 导入来实现高德定位 老版本 链接:https://blog.csdn.net/DickyQie/...

切切歆语
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部