0

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


背景资料

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

  • 构建屋顶(),
  • 构建窗口(),
  • 构建门(),
  • ETC。,
  • 获取房屋()。

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

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 方法中调用它的方法(无论如何,为了获得多态行为,我会让 CottageBuilder 子类化 HouseBuilder - 所以我会让 CottageBuilder 变成类似于 HouseBuilder 周围的装饰器)。

哪种方法更好?

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


请注意,我的构建器实际上并不是要构建 House 对象,而是来自不同域的对象。我决定不通过描述目标域来污染问题,而是弥补这个类比,在我看来,它非常适合原始问题。

4

1 回答 1

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
}
于 2012-08-16T07:29:03.470 回答