创建型模式-抽象工厂模式
抽象工厂模式是一种创建型设计模式,它提供了一种创建一组相关或相互依赖对象的接口,而无需指定具体的类。抽象工厂模式允许客户端使用抽象接口来创建一系列相关的对象,从而实现了产品家族的概念。
抽象工厂模式通常涉及角色
-
抽象工厂(
Abstract Factory
):抽象工厂是一个接口或抽象类,定义了一组创建相关对象的方法。它负责声明用于创建不同产品家族的方法,每个方法通常对应一个产品等级结构。
-
具体工厂(
Concrete Factory
):具体工厂是抽象工厂的具体实现类。它实现了抽象工厂中定义的创建相关对象的方法,并负责实例化具体的产品对象。
-
抽象产品(
Abstract Product
):抽象产品是一个接口或抽象类,定义了产品的通用行为和特征。具体的产品类将实现这个抽象产品,并提供具体的实现细节。
-
具体产品(
Concrete Product
):具体产品是抽象产品的具体实现类。它们实现了抽象产品中定义的方法,并提供了具体的功能。
抽象工厂模式的工作流程
- 客户端通过实例化具体的工厂类来创建抽象工厂对象。
- 客户端使用抽象工厂对象的方法来创建一组相关的产品对象。
- 抽象工厂对象根据具体工厂类的实现,实例化具体的产品对象,并返回给客户端。
- 客户端通过抽象产品的接口使用具体的产品对象,而不需要知道具体产品的实现细节。
抽象工厂模式的优点
- 提供了一种统一的接口来创建一组相关的产品对象,保证了产品之间的兼容性。
- 隐藏了具体产品的实现细节,使得客户端代码与具体产品解耦,增加了代码的灵活性和可维护性。
- 支持产品家族的扩展,可以通过添加新的具体工厂类和具体产品类来扩展现有的产品等级结构。
::: warning
需要注意的是,抽象工厂模式适用于需要一次性创建一系列相关对象的情况,而不适用于动态添加新产品的情况。如果需要动态地添加新产品,建议使用工厂方法模式。
:::
抽象工厂模式示例
以创建不同操作系统下的按钮和窗口为例:
// 抽象产品接口
interface Button {
void render();
}
interface Window {
void display();
}
// 具体产品实现类
class WindowsButton implements Button {
public void render() {
System.out.println("Rendering a Windows button.");
}
}
class WindowsWindow implements Window {
public void display() {
System.out.println("Displaying a Windows window.");
}
}
class MacOSButton implements Button {
public void render() {
System.out.println("Rendering a macOS button.");
}
}
class MacOSWindow implements Window {
public void display() {
System.out.println("Displaying a macOS window.");
}
}
// 抽象工厂接口
interface GUIFactory {
Button createButton();
Window createWindow();
}
// 具体工厂实现类
class WindowsFactory implements GUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Window createWindow() {
return new WindowsWindow();
}
}
class MacOSFactory implements GUIFactory {
public Button createButton() {
return new MacOSButton();
}
public Window createWindow() {
return new MacOSWindow();
}
}
// 客户端
public class Main {
public static void main(String[] args) {
GUIFactory factory;
// 根据当前操作系统选择具体工厂
String os = System.getProperty("os.name").toLowerCase();
if (os.contains("windows")) {
factory = new WindowsFactory();
} else {
factory = new MacOSFactory();
}
// 使用工厂创建产品
Button button = factory.createButton();
Window window = factory.createWindow();
// 使用产品
button.render(); // Output: Rendering a Windows button.
window.display(); // Output: Displaying a Windows window.
}
}
在上述示例中,我们使用抽象工厂模式来创建不同操作系统下的按钮和窗口。Button
和 Window
是抽象产品接口,定义了按钮和窗口的通用行为。WindowsButton
、WindowsWindow
、MacOSButton
和 MacOSWindow
是具体产品类,分别实现了抽象产品接口。
GUIFactory
是抽象工厂接口,定义了创建按钮和窗口的方法。WindowsFactory
和 MacOSFactory
是具体工厂类,分别实现了抽象工厂接口,用于创建相应操作系统下的按钮和窗口。
在客户端 Main
类中,我们根据当前操作系统选择具体的工厂类,并使用工厂对象创建按钮和窗口。然后,我们可以通过按钮和窗口的接口来使用具体的功能。
这样,通过抽象工厂模式,我们可以根据当前操作系统选择不同的工厂,而无需在客户端代码中直接实例化具体的产品类。这样可以实现产品家族的概念,并且使客户端代码与具体产品解耦。
据当前操作系统选择具体的工厂类,并使用工厂对象创建按钮和窗口。然后,我们可以通过按钮和窗口的接口来使用具体的功能。
这样,通过抽象工厂模式,我们可以根据当前操作系统选择不同的工厂,而无需在客户端代码中直接实例化具体的产品类。这样可以实现产品家族的概念,并且使客户端代码与具体产品解耦。
总的来说,抽象工厂模式提供了一种创建一组相关对象的接口,隐藏了具体产品的实现细节,使客户端代码与具体产品解耦。它支持产品家族的扩展,并提供了一种灵活的方式来创建对象。