我正在设计一个新的应用程序并考虑以下问题。
背景资料
我将有一个名为HouseBuilder的构建器类来构建House类型的对象。构建器将提供以下方法:
在客户端代码中,我通常会使用这样的构建器类:
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实例,我会让它在它的构造函数中要求依赖。然而,从客户端代码的角度来看,将HouseBuilder实例设置为CottageBuilder实例似乎很奇怪。
请注意,我的构建器实际上并不构建House对象,而是构建来自不同域的对象。我决定不用描述目标域来污染这个问题,而是编写这个类比,我认为这个问题很适合原始问题。
答案 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
}