Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于抽象工厂模式的取消绑定_Java_Design Patterns - Fatal编程技术网

Java 关于抽象工厂模式的取消绑定

Java 关于抽象工厂模式的取消绑定,java,design-patterns,Java,Design Patterns,我正在浏览抽象工厂设计模式,下面是它的UML图。。 请为我推荐这个paatern的最佳示例,因为我已经尽了最大的努力,但我正在寻找一个易于学习的示例,并希望使我对抽象工厂模式的理解100%清晰。请告知您是否看过JDK中内置的DocumentBuilderFactory类?它正是这样做的,它的目标项是一个文档对象 jdk有DocumentBuilderFactory类,它使用服务定位器策略来查找DocumentBuilderFactory类的具体实现(即xerces或其他解析器) java.aw

我正在浏览抽象工厂设计模式,下面是它的UML图。。


请为我推荐这个paatern的最佳示例,因为我已经尽了最大的努力,但我正在寻找一个易于学习的示例,并希望使我对抽象工厂模式的理解100%清晰。请告知

您是否看过JDK中内置的DocumentBuilderFactory类?它正是这样做的,它的目标项是一个文档对象

jdk有DocumentBuilderFactory类,它使用服务定位器策略来查找DocumentBuilderFactory类的具体实现(即xerces或其他解析器)

java.awt.Toolkit是另一个很好的例子。这一次,它使用JVM实现本身来提供实例:

Toolkit toolkit = Toolkit.getDefaultToolkit();

实际的具体类根据您所使用的操作系统以及您是否在headless模式下运行而有所不同。

您看过JDK中内置的DocumentBuilderFactory类吗?它正是这样做的,它的目标项是一个文档对象

jdk有DocumentBuilderFactory类,它使用服务定位器策略来查找DocumentBuilderFactory类的具体实现(即xerces或其他解析器)

java.awt.Toolkit是另一个很好的例子。这一次,它使用JVM实现本身来提供实例:

Toolkit toolkit = Toolkit.getDefaultToolkit();

实际的具体类根据您所使用的操作系统以及是否在无头模式下运行而有所不同。

回想一下,Factory模式用于创建对象,而不指定对象的确切类,从而减少了这两个组件之间的耦合。抽象工厂模式甚至通过定义所有工厂都必须实现的接口来减少解耦量。因此,抽象工厂的调用方不知道工厂的实现以及对象是如何创建的。调用方现在在工厂中调用方法将生成接口X的某个对象实例

Matt的XML库示例实际上是一个很好的示例。抽象工厂是创建XML解析器的实体,它创建一个表示您解析的实际文档的
文档
对象。实际上,对于作为调用者的您来说,只要您从中获得
文档
对象,大多数情况下使用哪个解析器是完全无关的。因此,您可以简单地使用抽象工厂。这将创建一个有效的解析器(大多数情况下;))


工具箱示例(Matt也提到)是一个更像教科书的示例。假设您只想在用户屏幕上填充一个窗口。由于您希望以独立于平台的方式执行此操作,因此可以定义一个抽象类窗口,通过该窗口可以执行某些操作。然后创建一个创建这些窗口的对象,比如说
Win32WindowsFactory
。但是,由于您的代码应该是独立于平台的,因此您定义了一个接口
WindowsFactory
,它为您提供了一个方法
createWindow()
。使用
Win32WindowsFactory
时,返回
Win32Window
;使用
LinuxGTKWindowsFactory
时,返回
GTKWindow

回想一下,Factory模式用于创建对象,而不指定对象的确切类别,因此减少了这两个组件之间的耦合。抽象工厂模式甚至通过定义所有工厂都必须实现的接口来减少解耦量。因此,抽象工厂的调用方不知道工厂的实现以及对象是如何创建的。调用方现在在工厂中调用方法将生成接口X的某个对象实例

Matt的XML库示例实际上是一个很好的示例。抽象工厂是创建XML解析器的实体,它创建一个表示您解析的实际文档的
文档
对象。实际上,对于作为调用者的您来说,只要您从中获得
文档
对象,大多数情况下使用哪个解析器是完全无关的。因此,您可以简单地使用抽象工厂。这将创建一个有效的解析器(大多数情况下;))


工具箱示例(Matt也提到)是一个更像教科书的示例。假设您只想在用户屏幕上填充一个窗口。由于您希望以独立于平台的方式执行此操作,因此可以定义一个抽象类窗口,通过该窗口可以执行某些操作。然后创建一个创建这些窗口的对象,比如说
Win32WindowsFactory
。但是,由于您的代码应该是独立于平台的,因此您定义了一个接口
WindowsFactory
,它为您提供了一个方法
createWindow()
。使用
Win32WindowsFactory
时,返回
Win32Window
;使用
LinuxGTKWindowsFactory
时,返回
GTKWindow

它最常见的用例是依赖注入。您可以在其中一些线程中找到详细信息
它最常见的用例是依赖注入。您可以在其中一些线程中找到详细信息

这里有些混乱。我想说DocumentBuilderFactory实际上是抽象工厂,DocumentBuilder是该工厂的抽象产品。这里有些混乱。我想说DocumentBuilderFactory实际上是抽象工厂,DocumentBuilder是该工厂的抽象产品。