# 定义
# 抽象工厂是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工作留给了具体工厂类。 每个工厂类型都对应一个特定的产品变体。
在创建产品时, 客户端代码调用的是工厂对象的构建方法, 而不是直接调用构造函数 ( 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
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
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
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
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
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
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
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
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
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
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
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