抽象工厂设计模式

2022/11/15 设计模式

# 定义

# 抽象工厂是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。

在创建产品时, 客户端代码调用的是工厂对象的构建方法, 而不是直接调用构造函数 ( new操作符)。 由于一个工厂对应一种产品变体, 因此它创建的所有产品都可相互兼容。

客户端代码仅通过其抽象接口与工厂和产品进行交互。 该接口允许同一客户端代码与不同产品进行交互。 你只需创建一个具体工厂类并将其传递给客户端代码即可。

# 示例

# 跨平台 GUI 组件系列及其创建方式

在本例中, 按钮和复选框将被作为产品。 它们有两个变体: macOS 版和 Windows 版。

抽象工厂定义了用于创建按钮和复选框的接口。 而两个具体工厂都会返回同一变体的两个产品。

客户端代码使用抽象接口与工厂和产品进行交互。 同样的代码能与依赖于不同工厂对象类型的多种产品变体进行交互。

# 1. 定义第一个产品层次结构

  • abstract_factory.buttons.Button.java
package abstract_factory.buttons;

public interface Button {

    void paint();

}
1
2
3
4
5
6
7
  • abstract_factory.buttons.MacOSButton.java
package abstract_factory.buttons;

public class MacOSButton implements Button {

    public void paint() {
        System.out.println("You hava created MacOS button.");
    }

}

1
2
3
4
5
6
7
8
9
10
  • abstract_factory.buttons.WindowsButton
package abstract_factory.buttons;

public class WindowsButton implements Button {

    public void paint() {
        System.out.println("You hava created WindowsButton.");
    }

}

1
2
3
4
5
6
7
8
9
10

# 2. 定义第二个产品层次结构

  • abstract_factory.checkboxs.Checkbox.java
package abstract_factory.checkboxs;

public interface Checkbox {

    void paint();

}

1
2
3
4
5
6
7
8
  • abstract_factory.checkboxs.MacOSCheckbox.java
package abstract_factory.checkboxs;

public class MacOSCheckbox implements Checkbox {

    public void paint() {
        System.out.println("You hava created MacOSCheckbox.");
    }

}

1
2
3
4
5
6
7
8
9
10
  • abstract_factory.checkboxs.WindowCheckbox.java
package abstract_factory.checkboxs;

public class WindowCheckbox implements Checkbox {

    public void paint() {
        System.out.println("You hava created WindowsCheckbox.");
    }

}

1
2
3
4
5
6
7
8
9
10

# 3. 抽象工厂 abstract_factory.factories.GUIFactory.java

package abstract_factory.factories;

import abstract_factory.buttons.Button;
import abstract_factory.checkboxs.Checkbox;

public interface GUIFactory {

    Button createButton();

    Checkbox createCheckbox();

}

1
2
3
4
5
6
7
8
9
10
11
12
13

# 4. 具体工厂

  • MacOS: abstract_factory.factories.MacOSFactory.java
package abstract_factory.factories;

import abstract_factory.buttons.Button;
import abstract_factory.buttons.MacOSButton;
import abstract_factory.checkboxs.Checkbox;
import abstract_factory.checkboxs.MacOSCheckbox;

public class MacOSFactory implements GUIFactory {

    public Button createButton() {
        return new MacOSButton();
    }

    public Checkbox createCheckbox() {
        return new MacOSCheckbox();
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • Windows: abstract_factory.factories.WindowsFactory.java
package abstract_factory.factories;

import abstract_factory.buttons.Button;
import abstract_factory.buttons.WindowsButton;
import abstract_factory.checkboxs.Checkbox;
import abstract_factory.checkboxs.WindowCheckbox;

public class WindowsFactory implements GUIFactory {

    public Button createButton() {
        return new WindowsButton();
    }

    public Checkbox createCheckbox() {
        return new WindowCheckbox();
    }

}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 5. 客户端代码: abstract_factory.app.Application.java

package abstract_factory.app;

import abstract_factory.buttons.Button;
import abstract_factory.checkboxs.Checkbox;
import abstract_factory.factories.GUIFactory;

public class Application {

    private Button button;

    private Checkbox checkbox;

    public Application(GUIFactory guiFactory) {
        button = guiFactory.createButton();
        checkbox = guiFactory.createCheckbox();
    }

    public void paint() {
        button.paint();
        checkbox.paint();
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 6. 程序配置: abstract_factory.Demo.java

package abstract_factory;

import abstract_factory.app.Application;
import abstract_factory.factories.GUIFactory;
import abstract_factory.factories.MacOSFactory;
import abstract_factory.factories.WindowsFactory;

public class Demo {


    public static void main(String[] args) {
        Application application = configureApplicatio();
        application.paint();
    }

    private static Application configureApplicatio() {
        Application application;
        GUIFactory guiFactory;
        String osName = System.getProperty("os.name").toLowerCase();
        if (osName.contains("mac")) {
            guiFactory = new MacOSFactory();
        } else {
            guiFactory = new WindowsFactory();
        }
        application = new Application(guiFactory);
        return application;
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Last Updated: 2022/11/14 23:03:58