增强构建器 - 构建构建器的子类或创建构建器装饰器吗?

时间:2012-08-15 14:44:53

标签: design-patterns

我正在设计一个新的应用程序并考虑以下问题。


背景资料

我将有一个名为HouseBuilder的构建器类来构建House类型的对象。构建器将提供以下方法:

  • buildRoof(),
  • buildWindow(),
  • buildDoor(),
  • 等,
  • getHouse()。

在客户端代码中,我通常会使用这样的构建器类:

HouseBuilder builder = new HouseBuilder();
House house = builder.buildRoof().buildWindow().buildWindow().buildDoor().getHouse();

这是正在使用的Builder设计模式的典型示例。


问题

在客户端代码中,我需要构建一个特定类型的房子,比方说一个小屋。每次我需要一个新的时候,从基本构建块(例如上面的例子)构建别墅似乎是很多不必要的重复代码。

因此我会创建一个新的构建器类,比如一个CottageBuilder,它可以允许这样的东西:

HouseBuilder builder = new CottageBuilder();
House house = builder.buildCottage().getHouse();

我不确定设计CottageBuilder的最佳方法是什么。我想到了两个选择:

  • 让CottageBuilder成为HouseBuilder的子类,并在buildCottage方法中使用父方法,
  • 让CottageBuilder接受一个HouseBuilder实例,并在buildCottage方法中调用它的方法(无论如何我都会将HouseBuilder子类化为HouseBuilder,以获得多态行为 - 所以我会让CottageBuilder成为HouseBuilder周围的装饰者。) / LI>

哪种方法更好?

我能想到的第二种方法的一个缺点是CottageBuilder需要依赖另一个HouseBuilder实例,我会让它在它的构造函数中要求依赖。然而,从客户端代码的角度来看,将HouseBuilder实例设置为CottageBuilder实例似乎很奇怪。


请注意,我的构建器实际上并不构建House对象,而是构建来自不同域的对象。我决定不用描述目标域来污染这个问题,而是编写这个类比,我认为这个问题很适合原始问题。

1 个答案:

答案 0 :(得分:1)

“构建器”通常通过一系列步骤构建对象,例如示例中的HouseBuilder。你的CottageBuilder不是真正的建造者,而是一个返回特定类型房屋的“工厂”。所以我会有一个HouseFactory类,用于创建不同类型的房屋的静态方法:

public class HouseFactory {
  public static House createCottage() {
    HouseBuilder builder = new HouseBuilder();
    // use builder to build cottage
    return builder.getHouse();
  }

  // more methods for other types of houses
}