我遇到过各种不允许直接创建实例的类。相反,我们必须从其他类的静态方法创建它们的实例,或者它拥有静态方法。例如:
B b = A.getB();
或
B b = B.getInstance();
背后是什么原因?
为什么他们不允许直接创建实例,如:
B b = new B();
答案 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)
一些使用案例: