抽象工厂模式(Abstract Factory Pattern)是一种常用的创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通过定义一组抽象工厂和一组抽象产品来实现,每个具体工厂负责创建一族产品,这样可以实现产品族的创建和使用的解耦。
抽象工厂模式主要包含四个角色:
- 抽象工厂(Abstract Factory):定义了一组用于创建抽象产品的方法,每个方法对应一个产品族的创建。
- 具体工厂(Concrete Factory):实现抽象工厂接口,负责创建具体产品的实例。
- 抽象产品(Abstract Product):定义了产品的共同接口,每个抽象产品对应一个产品族。
- 具体产品(Concrete Product):实现抽象产品接口,是抽象工厂创建的目标。
下面是一个示例,说明如何使用抽象工厂模式创建不同类型的按钮和文本框对象:
// 抽象产品 - 按钮
interface Button {
void click();
}
// 具体产品 - Windows 按钮
class WindowsButton implements Button {
@Override
public void click() {
System.out.println("Windows button clicked.");
}
}
// 具体产品 - Mac 按钮
class MacButton implements Button {
@Override
public void click() {
System.out.println("Mac button clicked.");
}
}
// 抽象产品 - 文本框
interface TextField {
void inputText(String text);
}
// 具体产品 - Windows 文本框
class WindowsTextField implements TextField {
@Override
public void inputText(String text) {
System.out.println("Windows text field: " + text);
}
}
// 具体产品 - Mac 文本框
class MacTextField implements TextField {
@Override
public void inputText(String text) {
System.out.println("Mac text field: " + text);
}
}
// 抽象工厂
interface GUIFactory {
Button createButton();
TextField createTextField();
}
// 具体工厂 - Windows 工厂
class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextField createTextField() {
return new WindowsTextField();
}
}
// 具体工厂 - Mac 工厂
class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextField createTextField() {
return new MacTextField();
}
}
// 示例使用
public class AbstractFactoryPatternExample {
public static void main(String[] args) {
// 创建 Windows 工厂
GUIFactory windowsFactory = new WindowsFactory();
Button windowsButton = windowsFactory.createButton();
TextField windowsTextField = windowsFactory.createTextField();
windowsButton.click(); // 输出:Windows button clicked.
windowsTextField.inputText("Hello"); // 输出:Windows text field: Hello
// 创建 Mac 工厂
GUIFactory macFactory = new MacFactory();
Button macButton = macFactory.createButton();
TextField macTextField = macFactory.createTextField();
macButton.click(); // 输出:Mac button clicked.
macTextField.inputText("Hello"); // 输出:Mac text field: Hello
}
}
在上面的示例中,Button
和 TextField
是抽象产品接口,WindowsButton
、MacButton
、WindowsTextField
和 MacTextField
是具体产品类,实现了抽象产品接口。GUIFactory
是抽象工厂接口,包含了创建按钮和文本框的方法。WindowsFactory
和 MacFactory
是具体工厂类,分别实现了 GUIFactory
接口,负责创建相应的具体产品对象。
通过使用抽象工厂模式,客户端代码只需要与抽象工厂和抽象产品接口进行交互,而不需要直接与具体产品类打交道。这样可以使代码更加灵活和可扩展,当需要切换不同的产品族时,只需要修改具体工厂类而不影响客户端代码。