【问题标题】:builder pattern and limiting implicit object creation构建器模式和限制隐式对象创建
【发布时间】:2011-07-14 21:05:32
【问题描述】:

如果我使用创建某些产品的构建器模式,我可能应该想要限制通过显式方式创建此产品的能力?

因为我的代码的用户可能不会像 new PRODUCT() 这样创建 PRODUCT。

我的意思是我的代码的用户我不知道某些构建器。

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

这种方法有意义吗?可以吗?

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    或者您将构造函数设置为受保护,并在同一个包中创建一个构建器,以便它可以访问它,或者创建甚至可能隐式使用您的构建器的静态方法。

    【讨论】:

    • 另外,我会在 Product 类的 JavaDoc 中添加一个提示,即可以从 ProductBuilder(或其他任何名称)获取实例。
    • 是的。或者保持原样,作为包级别。但后来我将有很多包含两个类的包 - 产品及其构建器。我猜我的结构不是很好。
    【解决方案2】:

    如果您的ProductBuilder 能够通过反射创建Product 的实例,那么任何其他类都可以这样做。

    我认为,将 builder 和 product 添加到同一个命名空间(包)并将构造函数包私有化会更容易。它具有相同的效果(对于包外的类不可见)并保持代码干净。

    【讨论】:

    • 但是我可能有很多包含两个类的包 - 产品及其构建器。我猜我的结构不是很好。我认为,例如,如果我将构造函数设为私有,它应该说你不应该以这种方式创建这个对象。但是是的,然后可以使用反射,但他们会首先想到,'也许某处有一个构建器可以创建该类的这个对象'
    • @ses - 为什么?您可以将所有不同的产品及其所有构建器放在一个包中。只要用户 不将他们的类放在同一个包中,该解决方案就可以满足您的需求:用户 不能启动产品类。 - 而且,一个包私有构造函数,可能伴随着解释性的 javadoc(“仅由构建器调用”)将具有与将其设为私有相同的效果。
    【解决方案3】:

    您似乎在描述的是Factory Pattern(而不是构建器模式)。

    实现这一点的最简单方法是将构造函数设为私有并在 Product 类上提供静态工厂方法。这是最低限度的实现:

    public class Product {
        private Product() {}
    
        public static Product create() {
            return new Product();
        }
    }
    

    JDK 中有很多遵循这种模式的类,例如 Integer.parseInt 是静态工厂方法,创建为 Integer(尽管构造函数不是私有的)

    或者,您可以在与 Product 相同的包中创建一个单独的 Factory 类,并为 Product 构造函数提供默认可见性。

    你应该避免使用反射,除非你真的需要它。在这种情况下,您不需要它 - 让事情尽可能简单(但不要更简单)。

    【讨论】:

    • 当 PRODUCT 可以处理自己的创建(通过工厂方法)时,有时不是很好,从逻辑的角度来看。那么,你认为使用反射很糟糕?
    • 是的,这就是工厂模式。但问题是关于构建器模式的,它略有不同。
    猜你喜欢
    • 2016-01-17
    • 2014-08-06
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多