我正在阅读Effective Java并阅读静态工厂方法来创建对象。其第2章,第1项。有优势没有。 3,作者提到过喜欢
以这种方式隐藏实现类可以产生非常紧凑的API。这种技术适用于基于接口的框架,其中接口为静态工厂方法提供自然返回类型。
我无法理解基于接口的框架是什么?
答案 0 :(得分:7)
也许改写它会有所帮助:
一个基于接口的框架是一个框架,只允许用户/客户端lib访问接口,同时实际提供实现这些接口的类。
<这种方法的好处在于让实现者完全控制实现并同时为客户端提供稳定的API。
我最近遇到了一个例子,客户端获得了{来自API方法的{1}}。在框架内部,此处理器有三种完全不同的实现:XmlProcessor
,DomXmlProcessor
和SaxXmlProcessor
。各个实现的细节与客户无关,可以随时切换。
答案 1 :(得分:4)
基于接口的框架是那些使用Interface及其实现设计的框架。
Collection framework是基于接口的框架的一个很好的例子。
以这种方式隐藏实现类可以产生非常紧凑的API
您只需创建一个界面
interface Animal{
public void eat();//hiding the implementation
public Animal getAnimalInstance();//factory method
}
您的实施者将负责实施。
您的API使用者将像我们在集合中那样直接使用界面
List<String> list = new ArrayList<String>();
另见
答案 2 :(得分:1)
主要向用户公开接口的框架(而不是具体实现)
既然你提到了Bloch,我将举例说明集合框架。您可以看到Collections
班级有synchronizedX(..)
,unmodifiableX(..)
,singletonX(..)
方法。这些是静态工厂方法,并且有很多,但它们只返回接口 - List
,Map
,Set
,SortedMap
。在幕后,有大量的实现,你不需要知道。
另一个例子(但没有关注静态工厂)是JDBC API。那里几乎没有课程 - Connection
,Stetement
,PreparedStatement
,ResultSet
等都是接口。这允许针对不同数据库存在许多实现,而无需用户产生任何差异。 (想象一下,如果你必须在MySQLStatement
,OracleConnection
等代码类中使用。)
答案 3 :(得分:1)
当您设计软件时,有一些核心设计原则可帮助管理复杂任务中涉及的复杂性。
其中一个核心原则是将复杂问题细分为更小问题,更易于管理和理解。
接口实际上是一份合同。它定义了一个类必须遵循的服务以及如何使用它。界面隐藏了合同的一个或多个可能实现的实现细节。
典型的Java应用程序将设计有接口,以模拟软件不同部分提供的核心合同。实现细节是隐藏的,因此可以降低复杂性。
更具体地说,假设您设计了一个会计应用程序。所有账户都提供相同的基本服务:获取当前余额,信贷或取款,请求过去操作的摘要。您可以定义一个类似于所有类型帐户的界面:
public interface Account {
double getBalance();
void credit(double amount);
void withdraw(double amount);
List<Operation> getOperations(Date startDate, Date endDate);
}
通过这个定义,例如可以很容易地提供允许用户管理其帐户的用户界面。实际上支票账户,信用卡账户之间存在差异。您必须直接管理银行数据库中存在的不同帐户,或其他银行的远程帐户。一个是直接操作,另一个是使用某种网络协议来执行操作。
但是从您的角度来看,您所需要的只是履行合同。你可以在帐户上工作。有关特定帐户操作如何完成的详细信息不是您的问题。
这很好看,但问题仍然存在。你如何获得你的账户?这就是来自另一家银行的折扣帐户肯定与本地帐户不同。代码不同。以及创建它的方式。对于远程帐户,您需要例如到其他银行服务器的网络地址......另一个可能需要数据库ID。
每次需要拥有帐户时,您都可以显式重新创建帐户,或者获取所有实施细节。远程帐户或本地帐户非常不同。
在应用程序的一部分中隔离这种复杂性是一种很好的做法。它符合将复杂的任务细分为更小,更简单的任务。
我给出了会计应用程序的例子,但事实上我们可以更一般。创建对象和检索已创建的对象是任何软件中非常常见的问题。因此,我们有一个共同的“好方法”,以可维护和干净的方式做到这一点。
管理创建获取特定对象的复杂性的代码,实际上隐藏了对象的构造或给定方式,称为工厂。
结合工厂(隐藏创建/查找对象的复杂性)和接口(隐藏每个对象实现的复杂性),如果工具Java程序员的基础用于管理软件复杂性。