关于抽象工厂模式的理解

时间:2012-08-13 17:09:46

标签: java design-patterns

我正在经历下面的抽象工厂设计模式是那个UML图。 enter image description here

请告诉我这个paatern最好的例子,因为我最好的尝试但是我正在寻找那个易于学习的例子,并希望让我对抽象工厂模式的理解100%清楚。请指教

3 个答案:

答案 0 :(得分:5)

您是否查看了JDK中内置的DocumentBuilderFactory类?它确实如此,它的目标项是Document对象。

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

// Uses service locator approach to find an implementor like xerces
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(...);

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

Toolkit toolkit = Toolkit.getDefaultToolkit();

根据您所使用的操作系统,以及您是否以无头模式运行,实际的具体课程会有所不同。

答案 1 :(得分:1)

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

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

Toolkit示例(Matt也提到)是一个更像学校书籍的例子。想象一下,您只想在用户屏幕上填充一个窗口。如果您希望以独立于平台的方式执行此操作,则可以定义一个抽象类Window,您可以使用该窗口执行某些操作。然后你创建一个创建这些窗口的对象,让我们说Win32WindowsFactory。但是,由于您的代码应与平台无关,因此您可以定义一个接口WindowsFactory,它为您提供方法createWindow()。使用Win32WindowsFactory时,会返回Win32Window,当使用LinuxGTKWindowsFactory时,会返回GTKWindow

答案 2 :(得分:0)

最常见的用例是依赖注入。您可以在其中一些主题中找到详细信息 What is dependency injection?