为什么有些类会限制直接实例化?

时间:2010-01-23 18:36:32

标签: java instantiation factory-pattern

我遇到过各种不允许直接创建实例的类。相反,我们必须从其他类的静态方法创建它们的实例,或者它拥有静态方法。例如:

B b = A.getB();

B b = B.getInstance();

背后是什么原因?

为什么他们不允许直接创建实例,如:

B b = new B();

5 个答案:

答案 0 :(得分:7)

有些类希望控制它们实例化的方式,从而保护它们的构造函数不被公共使用。使用像getInstance这样的静态工厂方法可以让它们将控件保存在自己的代码中。

有一百万个理由想要这样做。

编辑:要解决您的评论,这不能在构造函数内完成,因为new运算符总是创建一个新实例(除非异常是抛出)。在调用构造函数时,构造函数中的代码控制是否实例化对象为时已晚。

答案 1 :(得分:4)

这些是Singleton Pattern的一个例子。它们通常具有私有构造函数方法,但在我链接的示例中,它们使用 protected 来阻止实例化。

抽象类也无法实例化。

答案 2 :(得分:1)

当对象具有复杂的创建逻辑时,设计者将对象创建委托给specific objects 这符合single responsibility principle:目标是允许对象忽略其创建所需的结构和过程。

如果不使用Factory,复杂对象的创建将需要具有太多参数的长构造函数。

getInstance()的情况下,设计人员希望在他的应用程序中可以访问一个对象的单个实例:它是Singleton pattern,它等同于全局变量。

答案 3 :(得分:1)

两者都是creational patterns的实现,即模式,它们处理对象创建机制,尝试以适合情况的方式创建对象

  • 第一个示例看起来像Factory method pattern:定义用于创建对象的接口,但让子类决定实例化哪个类。 Factory Method允许类将实例化延迟到子类[Gof]。

  • 第二个例子是Singleton pattern:一个只能创建一个类实例的工厂。

他们不允许直接使用new创建实例,因为它们正是针对控制如何完成创建来解决特定问题:将类的实例化限制为一个单例的对象,让子类决定为工厂实例化哪个类。

答案 4 :(得分:1)

一些使用案例:

  1. 使用Factory模式时,只有Object的界面可见,实现本身可以由Factory选择和更改。
  2. createInstance方法在幕后执行一些无法在ctor
  3. 中完成的额外工作
  4. 该类可以对此对象使用Singleton并始终返回相同的实例
相关问题