[读书笔记]使用Builder模式创建Selenium WebDriver

在《[读书笔记]《Effective Java》第二章》[http://www.flyml.net/2017/02/05/effective-java-chapter-1/] 的Item2 提到:

使用builder替代多个参数的constructor

正好, 我要基于Selenium WebDriver 写一个爬虫。因为实际情况不一样, 有的时候需要使用不同的userAgent, 比如模拟移动浏览器, 有的时候需要挂不同的代理。 而且, 未来还很有可能通过更多的参数构建不同的WebDriver实例。其中,最重要的是要构建出不同的DesiredCapabilities

这是一个实际使用Builder模式的好场景,因为DesiredCapabilities的参数会越来越多

如果不使用Builder模式, 在当前情况下, 其实也是可以的:

非Builder模式

 

不过如果当参数更多的时候, 我们有两种选择:

  1. 原方法增加新的参数但是这种方法,会对原来的代码有影响, 会因为参数变多直接编译不通过。
  2. 增加新的同名方法, 使用重载机制但是每增加一个新的参数,就需要再新增一个重载方法, 在管理上面会非常的麻烦。甚至可能不同参数的组合也会被限制

这个时候, 使用Builder模式就比较灵活了。

本文原创,原文链接:http://www.flyml.net/2017/02/09/effective-java-builder-webdriver-demo/

使用Builder模式

 

在使用的时候, 如下:

 

这样, 当我们增加了新的参数, 就再也不怕了!

如果我们需要build的对象, 是我们自己的类, 而不是第三方的类, 更推荐的方式是将Builder作为嵌套类的方式进行应用。

注意: 第一次看到这里的时候, 我也挺困惑的:

在一个class之中, 居然可以有两个public class !

只不过另外一个是public static class

实际上, 这个builder 只是作为了外部public class的一个静态成员, 属于嵌套类

有一个写得还不错的帖子: Java方法参数太多怎么办—Part3—Builder模式 里面的使用方法更加复杂,感兴趣的可以去尝试一下。

原文代码太长(参数真的好多),对总览全貌不太方便, 我把参数删除还剩2个,可以看看下面精简之后的代码:

本文原创,原文链接:http://www.flyml.net/2017/02/09/effective-java-builder-webdriver-dem

如果我们要实现跟上面的DesiredCapabilitiesBuilder类似的复杂逻辑控制, 可以在Person 的构造函数之中进行控制。

一个问题:为什么使用final来限制Person的类成员变量?

其实我看到也有不少Sample 并没有使用final来限制。

如果不加final的限制,实际上是可变的时候, 推荐另外自己在Persion之中加上getters/setters

 

第二个问题:有没有什么实际使用Builder的例子?

stackoverflow 上面依然有我们想知道的问题的答案:

http://stackoverflow.com/questions/2169190/example-of-builder-pattern-in-java-api

我在guava上面找到一个例子(其他例子看起来就很复杂) :

https://github.com/google/guava/blob/master/guava/src/com/google/common/collect/Interners.java

 

本文为原创文章,转载请注明出处
原文链接:http://www.flyml.net/2017/02/09/effective-java-builder-webdriver-demo/

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注