抽象工厂设计模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式,可以将一组具有相同主题的单独工厂封装起来。在这种模式中,客户端不需要知道它从这些内部工厂中获取的具体对象是属于哪个类别。客户端只需要知道如何与这些工厂进行交互,而不需要关心如何创建具体的产品对象。
优点:
可以确保同一主题的产品对象是一致的。
客户端与具体产品类解耦,使得客户端代码更加简洁、易于维护。
有利于扩展,当需要增加新的产品族时,只需要增加新的具体工厂类,而不需要修改原有代码。
缺点:
增加了系统的复杂度,因为需要引入多个新的类。
当产品族中需要增加新的产品时,所有的工厂类都需要进行修改,增加了维护成本。
示例:
假设我们有一个跨平台的 UI 库,需要为不同的操作系统(如 Windows、macOS 和 Linux)提供不同的 UI 组件。我们可以使用抽象工厂模式来实现这个需求。
1. 首先,我们定义一个抽象工厂接口:
public interface AbstractUIFactory {
Button createButton();
Checkbox createCheckbox();
}
2. 然后,我们为每个操作系统创建具体的工厂类:
/**
* windows UI
**/
public class WindowsUIFactory implements AbstractUIFactory {
public Button createButton() {
return new WindowsButton();
}
public Checkbox createCheckbox() {
return new WindowsCheckbox();
}
}
public class MacOSUIFactory implements AbstractUIFactory {
public Button createButton() {
return new MacOSButton();
}
public Checkbox createCheckbox() {
return new MacOSCheckbox();
}
}
public class LinuxUIFactory implements AbstractUIFactory {
public Button createButton() {
return new LinuxButton();
}
public Checkbox createCheckbox() {
return new LinuxCheckbox();
}
}
3. 接下来,我们需要定义具体的产品类,即各个操作系统的 UI 组件:
public interface Button {
void render();
}
public interface Checkbox {
void render();
}
public class WindowsButton implements Button {
public void render() {
System.out.println("Rendering a Windows button");
}
}
public class WindowsCheckbox implements Checkbox {
public void render() {
System.out.println("Rendering a Windows checkbox");
}
}
public class MacOSButton implements Button {
public void render() {
System.out.println("Rendering a macOS button");
}
}
public class MacOSCheckbox implements Checkbox {
public void render() {
System.out.println("Rendering a macOS checkbox");
}
}
public class LinuxButton implements Button {
public void render() {
System.out.println("Rendering a Linux button");
}
}
public class LinuxCheckbox implements Checkbox {
public void render() {
System.out.println("Rendering a Linux checkbox");
}
}
4. 我们可以在客户端代码中使用抽象工厂模式来创建跨平台的 UI 组件:
public class Main {
public static void main(String[] args) {
AbstractUIFactory factory;
String osName = "Windows"; // 可以根据实际情况修改为 "macOS" 或 "Linux"
if (osName.equals("Windows")) {
factory = new WindowsUIFactory();
} else if (osName.equals("macOS")) {
factory = new MacOSUIFactory();
} else {
factory = new LinuxUIFactory();
}
Button button = factory.createButton();
Checkbox checkbox = factory.createCheckbox();
button.render();
checkbox.render();
}
}
这样,我们就可以根据不同的操作系统创建相应的 UI 组件,而客户端代码不需要关心具体的实现细节。当需要增加新的操作系统支持时,只需要添加新的具体工厂类即可。