抽象工厂案例

这里我们根据前面提到的这个抽象工厂进行代码编写
image-20240903202657245

1. 定义抽象产品接口

首先,我们定义手机和路由器的抽象接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 手机产品接口
public interface IPhoneProduct {
void start();
void shutdown();
void callup();
void sendSMS();
}

// 路由器产品接口
public interface IRouterProduct {
void start();
void shutdown();
void openWiFi();
void setting();
}

2. 定义具体产品类

接下来,我们实现这些接口,创建具体的产品类。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// 华为手机产品实现类
public class HuaweiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("华为手机开机");
}

@Override
public void shutdown() {
System.out.println("华为手机关机");
}

@Override
public void callup() {
System.out.println("华为手机打电话");
}

@Override
public void sendSMS() {
System.out.println("华为手机发送短信");
}
}

// 小米手机产品实现类
public class XiaomiPhone implements IPhoneProduct {
@Override
public void start() {
System.out.println("小米手机开机");
}

@Override
public void shutdown() {
System.out.println("小米手机关机");
}

@Override
public void callup() {
System.out.println("小米手机打电话");
}

@Override
public void sendSMS() {
System.out.println("小米手机发送短信");
}
}

// 华为路由器产品实现类
public class HuaweiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("华为路由器启动");
}

@Override
public void shutdown() {
System.out.println("华为路由器关闭");
}

@Override
public void openWiFi() {
System.out.println("华为路由器打开WiFi");
}

@Override
public void setting() {
System.out.println("华为路由器设置");
}
}

// 小米路由器产品实现类
public class XiaomiRouter implements IRouterProduct {
@Override
public void start() {
System.out.println("小米路由器启动");
}

@Override
public void shutdown() {
System.out.println("小米路由器关闭");
}

@Override
public void openWiFi() {
System.out.println("小米路由器打开WiFi");
}

@Override
public void setting() {
System.out.println("小米路由器设置");
}
}

3. 定义抽象工厂接口

然后,我们定义一个抽象工厂接口,包含创建手机和路由器的方法。

1
2
3
4
5
// 抽象工厂接口
public interface IProductFactory {
IPhoneProduct phoneProduct();
IRouterProduct routerProduct();
}

4. 实现具体工厂类

我们分别创建华为和小米的工厂类,实现抽象工厂接口。

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
// 华为工厂实现类
public class HuaweiFactory implements IProductFactory {
@Override
public IPhoneProduct phoneProduct() {
return new HuaweiPhone();
}

@Override
public IRouterProduct routerProduct() {
return new HuaweiRouter();
}
}

// 小米工厂实现类
public class XiaomiFactory implements IProductFactory {
@Override
public IPhoneProduct phoneProduct() {
return new XiaomiPhone();
}

@Override
public IRouterProduct routerProduct() {
return new XiaomiRouter();
}
}

5. 客户端代码

最后,我们在客户端代码中使用抽象工厂来创建产品。

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
public class Client {
public static void main(String[] args) {
// 创建华为工厂
IProductFactory huaweiFactory = new HuaweiFactory();
IPhoneProduct huaweiPhone = huaweiFactory.phoneProduct();
IRouterProduct huaweiRouter = huaweiFactory.routerProduct();

// 使用华为产品
huaweiPhone.start();
huaweiPhone.callup();
huaweiRouter.start();
huaweiRouter.openWiFi();

// 创建小米工厂
IProductFactory xiaomiFactory = new XiaomiFactory();
IPhoneProduct xiaomiPhone = xiaomiFactory.phoneProduct();
IRouterProduct xiaomiRouter = xiaomiFactory.routerProduct();

// 使用小米产品
xiaomiPhone.start();
xiaomiPhone.callup();
xiaomiRouter.start();
xiaomiRouter.openWiFi();
}
}

6. 运行结果

当你运行客户端代码时,输出将如下所示:

1
2
3
4
5
6
7
8
华为手机开机
华为手机打电话
华为路由器启动
华为路由器打开WiFi
小米手机开机
小米手机打电话
小米路由器启动
小米路由器打开WiFi

小结

这个例子展示了如何使用抽象工厂模式创建相关的产品族。通过这种模式,我们可以轻松地扩展新的产品类型(如添加新的品牌),而无需修改现有的代码结构。抽象工厂模式非常适合需要创建一组相关产品的场景。