我正在经历下面的抽象工厂设计模式是那个UML图。
请告诉我这个paatern最好的例子,因为我最好的尝试但是我正在寻找那个易于学习的例子,并希望让我对抽象工厂模式的理解100%清楚。请指教答案 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?