构建器模式和限制隐式对象创建

时间:2011-07-14 12:39:11

标签: java design-patterns

如果我使用构建模式来创建一些PRODUCT,我可能会想要限制以明确方式创建此PRODUCT的能力吗?

因为我的代码的用户可能不太好,所以会像新的PRODUCT()一样创建PRODUCT。

我的意思是我的代码的用户我不了解一些构建器。

那么,我应该将PRODUCT的构造函数设为私有吗?然后在Builder中我会使用反射来创建PRODUCT的初始实例?

这种方法有意义吗?好吗?

3 个答案:

答案 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的实例,那么任何其他类都可以这样做。

我认为,将构建器和产品添加到同一名称空间(包)并使构造函数包私有化会更容易。它具有相同的效果(对于包外的类是不可见的)并保持代码清洁。