1:抽象工厂模式简介
抽象工厂设计模式是创新模式之一。 抽象工厂模式几乎类似于工厂模式,它被视为工厂模式的另一层抽象。 抽象工厂模式围绕创建其他工厂的超级工厂工作。
抽象工厂模式实现为我们提供了一个框架,该框架使我们能够创建遵循常规模式的对象。 因此,在运行时,抽象工厂与可以创建所需类型的对象的任何所需的具体工厂结合在一起。
抽象工厂设计模式的UML类图示例。
抽象工厂:声明用于创建抽象产品对象的操作的接口。
具体工厂:实现在AbstractFactory中声明的操作以创建具体的产品对象。
产品:定义要由相应的具体工厂创建的产品对象,并实现AbstractProduct接口。
客户端:仅使用由AbstractFactory和AbstractProduct类声明的接口。
Abstract Factory提供了用于创建相关或相关对象族的接口,而无需指定其具体类。
客户端软件创建抽象工厂的具体实现,然后使用通用接口创建属于对象系列的具体对象。
客户端不知道或不在乎它们从这些具体工厂中获得哪个具体对象,因为客户仅使用其产品的通用接口。
因此,有了“抽象工厂”模式的思想,我们现在将尝试创建一个有助于创建相关对象的设计。
2:实例
UI工具箱是使用中的抽象工厂的一个示例。 在Windows,Mac和Linux上,UI合成(例如窗口,按钮和文本字段)都在诸如SWT的小部件API中提供。 但是,这些小部件的实现在不同平台上有所不同。 多亏了Abstract Factory的实现,我们可以编写独立于平台的客户端。
将UI工具包概念带入我们的Java代码示例中。 我们将创建一个需要创建窗口的客户端应用程序。
首先,我们需要创建我们的Window界面。 窗口是我们的AbstractProduct。
//Our AbstractProduct public interface Window{ public void setTitle(String text); public void repaint(); }
创建Window的两个实现,作为我们的ConcreteProducts。 一种用于Microsoft Windows:
//ConcreteProductA1 public class MSWindow implements Window{ public void setTitle(){ } public void repaint(){ } }
一种用于Mac OSX
//ConcreteProductA2 public class MacOSXWindow implements Window{ public void setTitle(){ //Mac OSX操作系统的特定行为 } public void repaint(){ } }
现在需要提供工厂。 首先,我们将定义AbstractFactory。 对于此示例,假设他们只是创建Windows:
//AbstractFactory public interface AbstractWidgetFactory{ public Window createWindow(); }
接下来,我们需要为我们的两个操作系统提供这些工厂的ConcreteFactory实现。
//ConcreteFactory1 public class MsWindowsWidgetFactory{ //创建一个MSWindow public Window createWindow(){ MSWindow window = new MSWindow(); return window; } } //ConcreteFactory2 public class MacOSXWidgetFactory{ //创建一个MacOSXWindow public Window createWindow(){ MacOSXWindow window = new MacOSXWindow(); return window; } }
最后,我们需要一个客户端来使用所有这些功能。
//Client public class GUIBuilder{ public void buildWindow(AbstractWidgetFactory widgetFactory){ Window window = widgetFactory.createWindow(); window.setTitle("New Window"); } }
当然,我们需要某种方式来指定GUIBuilder的AbstractWidgetFactory类型。 通常使用类似于以下代码的switch语句完成此操作:
public class Main{ public static void main(String[] args){ GUIBuilder builder = new GUIBuilder(); AbstractWidgetFactory widgetFactory = null; //检查处于什么平台 if(Platform.currentPlatform()=="MACOSX"){ widgetFactory = new MacOSXWidgetFactory(); } else { widgetFactory = new MsWindowsWidgetFactory(); } builder.buildWindow(widgetFactory); } }
以下是一个类图,表示我们刚刚完成的工作: