Builder模式在Java中的应用

在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成。那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则。

我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数,

DoDoContact(String name);

DoDoContact(String name, int age);

DoDoContact(String name, int age, String address);

DoDoContact(String name, int age, String address, int cardID);

这样一系列的构造函数主要目的就是为了提供更多的客户调用选择,以处理不同的构造请求。这种方法很常见,也很有效力,但是它的缺点也很多。类的作者不得不书写多种参数组合的构造函数,而且其中还需要设置默认参数值,这是一个需要细心而又枯燥的工作。其次,这样的构造函数灵活性也不高,而且在调用时你不得不提供一些没有意义的参数值,例如,DoDoContact("Ace", -1, "SH"),显然年龄为负数没有意义,但是你又不的不这样做,得以符合Java的规范。如果这样的代码发布后,后面的维护者就会很头痛,因为他根本不知道这个-1是什么含义。对于这样的情况,就非常适合使用Builder模式。Builder模式的要点就是通过一个代理来完成对象的构建过程。这个代理职责就是完成构建的各个步骤,同时它也是易扩展的。下面是改写自Effective Java里面的一段代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

public class DoDoContact {

    private final int    age;

    private final int    safeID;

    private final String name;

    private final String address;

    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 int    age     = 0;

        private int    safeID  = 0;

        private String name    = null;

        private String address = null;


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

   // 构建的步骤

        public Builder(String name) {

            this.name = name;

        }

        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;

        }

        public DoDoContact build() { // 构建,返回一个新对象

            return new DoDoContact(this);

        }

    }

    private DoDoContact(Builder b) {

        age = b.age;

        safeID = b.safeID;

        name = b.name;

        address = b.address;

    }

}

最终,客户程序可以很灵活的去构建这个对象。


1

2

3

4

DoDoContact ddc = new DoDoContact.Builder("Ace").age(10)

                .address("beijing").build();

System.out.println("name=" + ddc.getName() + "age =" + ddc.getAge()

                + "address" + ddc.getAddress());

时间: 2024-10-07 18:58:56

Builder模式在Java中的应用的相关文章

[转]Builder模式在Java中的应用

转自:http://www.cnblogs.com/moonz-wu/archive/2011/01/11/1932473.html 在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则. 我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数, DoDoCon

Builder模式在Java中的应用(转)

在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Builder模式来替代多参数构造函数是一个比较好的实践法则. 我们常常会面临编写一个这样的实现类(假设类名叫DoDoContact),这个类拥有多个构造函数, DoDoContact(String name); DoDoContact(String name, int age); DoDoContact(S

Android Builder模式在开发中的应用

最近在学习图片加载框架Glide的时候,被他精简的写法震惊了.一句话,就可以搞定. Glide.with(mContext) .load(url) .centerCrop() .placeholder(R.drawable.default_img) .crossFade() .into(mImageView); 同时在年初的时候,学习RXJava的时候,用链式编程很优雅. Observable .just( "1" , "2" ) .subscribeOn(Sche

【计算机网络】关于三种网络通信模式以及java中三种通信方式的实现介绍

当前的网络中有三种通讯模式:单播.广播.组播(多播),其中的组播出现时间最晚但同时具备单播和广播的优点,最具有发展前景. 一.单播: 主机之间"一对一"的通讯模式,网络中的交换机和路由器对数据只进行转发不进行复制.如果10个客户机需要相同的数据,则服务器需要逐一传送,重复10次相同的工作.但由于其能够针对每个客户的及时响应,所以现在的网页浏览全部都是采用IP单播协议.网络中的路由器和交换机根据其目标地址选择传输路径,将IP单播数据传送到其指定的目的地. 单播的优点: 1.  服务器及时

深刻理解代理模式在java中如何优化系统性能

最近参与实习公司的项目迭代,项目中需要实现系统的快速响应和大量数据处理.在不断的学习中获得一点儿心得,先记录下来.慢慢的修改! 关于代理模式的知识和简单应用之前的学习笔记中已经有记录了,可以复习一下.这里主要记录如何使用代理模式来实现延迟加载,进而提升系统系能和反应速度. 使用代理模式实现延迟加载的一个简单实例: 需求:项目中对系统的启动速度做了一定的要求 我们在系统首次加载时,因为不需要实际的数据来构造显示界面,这就为我们实现系统首次加载的快速响应提供了可能.在常规模式下,我们一般会在系统启动

浅谈代理 模式与java中的动态代理

代理模式的定义: 代理模式是一个使用律非常高的模式,定义如下: 为其他对象提供一种代理,以控制对这个对象的访问. 类图: 简单的静态代理: public interface IRunner{ //这是一个代理类和被代理类都需要实现的接口 //在接口中定义一个抽象函数 public void request(); } //下面是真实的被代理类 public class Runner implements IRunner{ //实现接口中的方法 public void request(){ //实现

23种设计模式介绍以及在Java中的实现

原创不易,转载请注明出处:http://anxpp.com/,谢谢!     文章比较长,读者可以通过顶端的目录选择要了解的模式,然后通过文章右边的按钮快速返回顶部重新选择一个新的模式浏览 博主精心准备了大量的示例代码.文章尽量提供与编程相关的例子,而不是像多数其他介绍的文章一样,提供一些感觉挺滑稽的例子(那样的例子可能看完觉得写得很好,然而还是不会用...). 本文耗费了作者大量时间,还请亲们给个赞O(∩_∩)O~ 也可以通过CTRL+F并输入要了解的模式并跳到对应位置. 文章中的示例源码在g

变种 Builder 模式:优雅的对象构建方式

读完本文你将了解到: 帅气的 Builder 链式调用 常见的两种构建方式 常见的构建方式之一定义多个重载的构造函数 常见的构建方式之二使用 setter 方法挨个构造 优雅的构建方式变种 Builder 模式 Android Studio 中使用插件自动生成 变种 Builder 模式代码 总结 Thanks 帅气的 Builder 链式调用 在日常开发中,经常可以看到这样的代码: Retrofit retrofit = new Retrofit.Builder() .baseUrl("htt

Java中socket接口调用

最近一个项目中接口通讯这一块主要是调用银联系统的socket接口,我方是客户端,即发送请求接收返回报文的一方.在贴代码之前,还是要了解一下关于socket的基础知识. Socket的基本概念 1.建立连接 当需要建立网络连接时,必须有一台机器运行一个程序,随时等候连接,而另一端的程序这对其发出连接请求.这一点同电话系统类似--必须有一方拨打电话,而另一方必须等候电话连通. 建立连接的过程为: (1)先在服务器端生成一个ServerSocket实例对象,随时监听客户端的连接请求. (2)当客户端需