Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
34 lines (22 sloc) 3.15 KB

BuilderPattern(构造者模式)

模式引入由来

当构造方法(静态工厂方法)包含多个参数时,考虑使用Builder。

当一个类的构造方法包含多个参数时,其中只有固定的几个参数是必须的,而其他的参数都是可选的,此时使用构造方法或者静态工厂方法都很不方便。

一般来说,有以下几种方式来对应这种情况:

  1. 采用telescoping constructor模式。即提供一个只有必要参数的构造器,第二个构造器有一个可选参数,第三个有两个可选参数,依此类推,最后一个构造器包含所有可选参数。这种模式的缺点在于为客户端(使用API的地方) 编程带来了麻烦,一旦参数顺序错误,将会导致难以发现的错误,另外这样的代码的可读性也非常低。

  2. 使用JavaBeans模式。即通过无参构造方法构造实例,然后使用setter方法进行属性的设置。这种方式不会有1中所说的缺点。但是JavaBeans模式有其自身的缺点:由于实例的完整构造过程是通过多次调用完成的,所以就存在实例不一致性(线程并发的情况)的问题。同时,JavaBeans模式阻止了类称为常量类,这就要求客户端进行并发的控制。

  3. 使用Builder模式。Builder Pattern综合了telescoping pattern的安全性和JavaBeans。客户端通过使用必须的参数来构造或者使用静态方法来获取Builder类的实例。然后客户端调用Builder实例的每个类似于setter的方法来设置Builder实例的属性。最后,调用Builder类的build方法来获取一个不变的实例。Builder类是目标类的inner static类。

模式定义

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

优缺点

优点 建造者模式的主要优点在于客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,符合“开闭原则”,还可以更加精细地控制产品的创建过程;

缺点 其主要缺点在于由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到一定的限制,如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

使用场景

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  • 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

Demo

简化版Builder模式Demo