使用静态构造函数或具有许多具有不同构造函数的对象的接口来组织对象的实例化方法更好吗? [处于保留状态]

问题描述 投票:-4回答:1

根据我的经验,到现在为止,似乎可以使用静态构造函数告诉人们要实例化的内容,也可以使用接口以及具有不同名称和构造函数的许多对象来执行相同的操作。也许,我从根本上误解了所有这些,但是,似乎,一方面,您可能具有包含许多静态构造函数的巨型对象,或者您可能具有包含许多实例化该接口的不同对象的接口。

与许多类的接口

Foo foo1 = new BigFoo();
Foo foo2 = new SmallFoo();

具有许多调用私有构造函数的静态工厂方法的类

FooObj foo01 = FooObj.bigFoo();
FooObj foo02 = FooObj.smallFoo();
java oop interface instantiation static-constructor
1个回答
2
投票

您正在思考的问题在著名的书中得到了回答。 Joshua Bloch撰写的有效Java,第三版。请注意,Joshua Bloch还是多个Java SE类的开发人员。

从书中引用:

项目1:代替构造器的考虑静态工厂方法

约书亚给出了以下使用静态工厂方法代替构造方法的原因

  • 静态工厂方法的一个优点是,与构造函数不同,它们具有名称
  • 静态工厂方法的第二个优点是,与构造函数不同,不需要每次都创建一个新对象它们被调用。
  • 静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回值的任何子类型的对象类型。
  • 静态工厂的第四个优点是,返回对象的类可以根据输入的不同而随调用而变化参数。
  • 静态工厂的第五个优点是,当包含该方法的类为书面。

Joshua还告诉我们静态工厂方法的问题

  • 仅提供静态工厂方法的主要限制是,不能对没有公共或受保护的构造函数的类进行子类化。

  • 静态工厂方法的第二个缺点是程序员很难找到它们。

Java.util.Collections可以看作是静态工厂方法的示例。从书中引用

例如,Java Collections Framework具有45个实用程序接口的实现,提供不可修改的集合,同步集合等。几乎所有这些通过静态工厂方法将实现导出为一个不可实例化的类(java.util.Collections)。的类别返回的对象都是非公开的。

作者进一步回应您的想法

Collections Framework API比以前小得多是否输出了45个单独的公共类,每个公共类一个方便实施。不仅仅是API的大部分减少但概念上的权重:程序员必须掌握的一些概念,才能使用API​​。的程序员知道返回的对象恰好具有API由其接口指定,因此无需阅读其他内容实现类的类文档。此外,使用这种静态工厂方法需要客户端引用通过接口而不是实现类返回对象,通常是好的做法(第64项)。

Java标准库由于Joshua Bloch建议的优点而广泛使用了静态工厂方法。另一个示例是java.lang.Boolean类中的valueOf函数。 valueOf静态工厂方法一次又一次地为您提供了相同的对象(基本上是缓存)

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

2
投票

是否公开公开构造方法,还是只公开构造方法,然后决定是否以及何时实例化一个类,这是一个设计决策,取决于您是否要在实例化之前进行逻辑处理,或者是否实例化哪个具体类的决定不取决于调用者。 引用维基百科:

工厂方法模式是一种创建模式,该模式使用工厂方法来处理创建对象的问题,而不必指定将要创建的对象的确切类。这是通过调用工厂方法(而不是通过构造函数)来创建对象的,该工厂方法是在接口中指定并由子类实现,或者在基类中实现,并且可以选择地由派生类覆盖。

在Java中发生这种情况的一个示例是Calendar类,它是abstract,并且不提供公共构造函数。相反,它提供了getInstance()方法,该方法执行一些逻辑以确定哪个是要为调用方实例化的正确具体实例。

© www.soinside.com 2019 - 2024. All rights reserved.