抽象工厂模式
...大约 2 分钟
抽象工厂是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
使用示例: 抽象工厂模式在 Java 代码中很常见。 许多框架和程序库会将它作为扩展和自定义其标准组件的一种方式。
以下是来自核心 Java 程序库的一些示例:
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
识别方法: 我们可以通过方法来识别该模式——其会返回一个工厂对象。 接下来, 工厂将被用于创建特定的子组件。
跨平台 GUI 组件系列及其创建方式
在本例中, 按钮和复选框将被作为产品。 它们有两个变体: macOS 版和 Windows 版。
抽象工厂定义了用于创建按钮和复选框的接口。 而两个具体工厂都会返回同一变体的两个产品。
客户端代码使用抽象接口与工厂和产品进行交互。 同样的代码能与依赖于不同工厂对象类型的多种产品变体进行交互。
项目结构

buttons: 第一个产品层次结构
buttons/Button.java
public interface Button {
void paint();
}
buttons/MacOSButton.java
public class MacOSButton implements Button{
@Override
public void paint() {
System.out.println("绘制了MacOS按钮");
}
}
buttons/WindowsOSButton.java
public class WindowsOSButton implements Button{
@Override
public void paint() {
System.out.println("绘制WindowsOS按钮");
}
}
checkboxes: 第二个产品层次结构
checkboxes/Checkbox.java
public interface Checkbox {
void paint();
}
checkboxes/MacOSCheckbox.java
public class MacOSCheckbox implements Checkbox{
@Override
public void paint() {
System.out.println("绘制了MacOS风格的复选框");
}
}
checkboxes/WindowsOSCheckbox.java
public class WindowsOSCheckbox implements Checkbox{
@Override
public void paint() {
System.out.println("绘制了WindowsOS风格的复选框");
}
}
factories
factories/GUIFactory.java: 抽象工厂
public interface GUIFactory {
// 创建按钮
Button createButton();
// 创建复选框
Checkbox createCheckBox();
}
factories/MacOSFactory.java: 具体工厂 ( macOS)
public class MacOSFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacOSButton();
}
@Override
public Checkbox createCheckBox() {
return new MacOSCheckbox();
}
}
factories/WindowsFactory.java: 具体工厂 (Windows)
public class WindowsFactory implements GUIFactory{
@Override
public Button createButton() {
return new WindowsOSButton();
}
@Override
public Checkbox createCheckBox() {
return new WindowsOSCheckbox();
}
}
app
app/Application.java: 客户端代码
public class Application {
private final Button button;
private final Checkbox checkbox;
public Application(GUIFactory factory){
this.button = factory.createButton();
this.checkbox = factory.createCheckBox();
}
public void paint(){
button.paint();
checkbox.paint();
}
}
Demo
public class Main {
public static void main(String[] args) {
GUIFactory factory;
Application application;
// 读取配置文件,获取GUI类型
String osName = System.getProperty("os.name");
osName = osName.toLowerCase();
if(osName.contains("windows")){
factory = new WindowsFactory();
}else if (osName.contains("mac")){
factory = new WindowsFactory();
}else {
throw new RuntimeException("未知的操作系统");
}
application = new Application(factory);
application.paint();
}
}
结果:
