Java 生成器模式和限制隐式对象创建

Java 生成器模式和限制隐式对象创建,java,design-patterns,Java,Design Patterns,如果我使用构建器模式创建一些产品,我会,可能应该想限制通过显式方式创建此产品的能力 因为我的代码的用户可能不会创建像new PRODUCT()这样的产品 我的意思是,我的代码的用户不知道一些生成器 那么,我应该将产品的构造函数设为私有吗?然后在构建器中,我会使用反射来创建产品的初始实例 这种方法有意义吗?可以吗 或者您将构造函数设置为受保护,并在同一个包中创建一个生成器,这样它就可以访问它,或者创建静态方法,甚至可以隐式使用您的生成器。或者您将构造函数设置为受保护,并在同一个包中创建一个生成器,

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

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

我的意思是,我的代码的用户不知道一些生成器

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


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

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

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

您所描述的被称为(而不是构建器模式)

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

public class Product {
    private Product() {}

    public static Product create() {
        return new Product();
    }
}
JDK中有很多类遵循这种模式,例如静态工厂方法,它创建为
Integer
(尽管构造函数不是私有的)

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


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

您似乎描述的内容称为(而不是构建器模式)

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

public class Product {
    private Product() {}

    public static Product create() {
        return new Product();
    }
}
JDK中有很多类遵循这种模式,例如静态工厂方法,它创建为
Integer
(尽管构造函数不是私有的)

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


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

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


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

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


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

此外,我还要向
产品
class'JavaDoc添加一个提示,即可以从
产品生成器
中获取实例(或任何其名称)。是的。或者保持原样,作为包级别。但是接下来我会有很多包含两个类的包——product和its-builder。我想我的结构不是很好。此外,我还想在
产品
类的JavaDoc中添加一个提示,即可以从
产品生成器
(或任何它的名称)获取实例。是的。或者保持原样,作为包级别。但是接下来我会有很多包含两个类的包——product和its-builder。我想我的结构不太好。有时,当产品能够以逻辑的观点处理自己的创造(通过工厂方法)时,我会觉得不太好。所以,使用反射是非常糟糕的,你认为?是的,这是工厂模式。但问题是关于构建器模式,这有点不同。有时,当产品能够以逻辑的观点处理自己的创建(通过工厂方法)时,情况就不太好了。所以,使用反射是非常糟糕的,你认为?是的,这是工厂模式。但是问题是关于builder模式,这有点不同。但是我可能有很多包有两个类-product和its builder。我想我不会是一个好的结构。我认为,例如,如果我将构造函数设为私有,它应该说您不应该以这种方式创建这个对象。但是是的,然后可以使用反射,但是他们首先会想,‘也许某个地方有一个构建器可以创建这个类的对象’@ses——为什么?您可以将所有不同的产品及其所有构建器放在一个包中。只要用户不将他们的类放在同一个包中,解决方案就符合您的需要:用户不能启动产品类。-而且,包私有构造函数,可能与解释性javadoc(“仅由构建器调用”)一起使用,将具有与私有化相同的效果。但是,我可能有很多包有两个类-product和its builder。我想我不会是一个好的结构。我认为,例如,如果我将构造函数设为私有,它应该说您不应该以这种方式创建这个对象。但是是的,然后可以使用反射,但是他们首先会想,‘也许某个地方有一个构建器可以创建这个类的对象’@ses——为什么?您可以将所有不同的产品及其所有构建器放在一个包中。只要用户不将他们的类放在同一个包中,解决方案就符合您的需要:用户不能启动产品类。-而且,包私有构造函数,可能与解释javadoc(“仅由构建器调用”)一起使用,将具有与私有化相同的效果。