如果我使用构建模式来创建一些PRODUCT,我可能会想要限制以明确方式创建此PRODUCT的能力吗?
因为我的代码的用户可能不太好,所以会像新的PRODUCT()一样创建PRODUCT。
我的意思是我的代码的用户我不了解一些构建器。
那么,我应该将PRODUCT的构造函数设为私有吗?然后在Builder中我会使用反射来创建PRODUCT的初始实例?
这种方法有意义吗?好吗?
答案 0 :(得分:1)
或者将构造函数设置为protected,并在同一个包中创建一个构建器,以便它可以访问它,或创建甚至可能隐式使用构建器的静态方法。
答案 1 :(得分:1)
您似乎要描述的内容称为Factory Pattern(而不是构建器模式)。
实现此目的的最简单方法是使构造函数成为私有,并在Product类上提供静态工厂方法。这是最低限度的实施:
public class Product {
private Product() {}
public static Product create() {
return new Product();
}
}
JDK中有很多类遵循这种模式,例如Integer.parseInt是静态工厂方法,创建为Integer
(虽然构造函数不是私有的)
或者,您可以在与Product相同的包中创建单独的Factory类,并为Product构造函数提供默认的可见性。
除非你真的需要,否则你应该避免使用反射。在这种情况下,您不需要它 - 尽可能保持简单(但不是更简单)。
答案 2 :(得分:1)
如果ProductBuilder
能够通过反射创建Product
的实例,那么任何其他类都可以这样做。
我认为,将构建器和产品添加到同一名称空间(包)并使构造函数包私有化会更容易。它具有相同的效果(对于包外的类是不可见的)并保持代码清洁。