我正在设计一个新的应用程序并考虑以下问题。
背景资料
我将有一个名为 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 对象,而是来自不同域的对象。我决定不通过描述目标域来污染问题,而是弥补这个类比,在我看来,它非常适合原始问题。