2

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

B b = A.getB();

或者

B b = B.getInstance();

这背后的原因是什么?

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

B b = new B();
4

5 回答 5

7

一些类想要控制它们被实例化的方式,从而保护它们的构造函数不被公共使用。使用静态工厂方法,例如getInstance允许他们将控制保留在自己的代码中。

想要这样做的原因有一百万个。

编辑:为了解决您的评论,这不能在构造函数中完成,因为new运算符将始终创建一个新实例(除非引发异常)。当构造函数被调用时,构造函数中的代码来控制对象是否被实例化已经太晚了。

于 2010-01-23T18:42:08.013 回答
4

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

抽象类也不能被实例化。

于 2010-01-23T18:37:40.910 回答
2

一些用例:

  1. 使用工厂模式,只有对象的接口是可见的,实现本身可以由工厂选择和更改。
  2. createInstance 方法在幕后做了一些无法在 ctor 内完成的额外工作
  3. 该类可以为此对象使用单例并且总是返回相同的实例
于 2010-01-23T19:44:45.460 回答
1

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

  • 第一个示例看起来像工厂方法模式:定义用于创建对象的接口,但让子类决定实例化哪个类。工厂方法允许类将实例化推迟到子类 [Gof]。

  • 第二个例子是单例模式:一个只能创建一个类的单个实例的工厂。

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

于 2010-01-23T19:41:41.590 回答
1

当对象具有复杂的创建逻辑时,设计者将对象创建委托给特定对象 。这符合单一职责原则:目标是允许对象忽略其创建所需的结构和过程。

如果不使用工厂,创建复杂对象将需要带有太多参数的长构造器。

在这种getInstance()情况下,设计者希望在整个应用程序中都可以访问一个对象的单个实例:它是单例模式,它相当于一个全局变量。

于 2010-01-23T18:59:50.433 回答