抽象工厂模式

模式定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

image-20230413192152239

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
public class AbstractFactoryTest {
public static void main(String[] args) {
IDatabaseUtils iDatabaseUtils = new OracleDataBaseUtils();
IConnection connection = iDatabaseUtils.getConnection();
connection.connect();
ICommand command = iDatabaseUtils.getCommand();
command.command();
}
}

// 变化 mysql,oracle
// connect,command

interface IConnection{
void connect();
}
class MySqlConnection implements IConnection{

@Override
public void connect() {
System.out.println("Mysql connected.");
}
}

class OracleConnection implements IConnection{

@Override
public void connect() {
System.out.println("Oracle connected.");
}
}

interface ICommand{
void command();
}

class MySqlCommand implements ICommand{

@Override
public void command() {
System.out.println("Mysql command.");
}
}

class OracleCommand implements ICommand{

@Override
public void command() {
System.out.println("Oracle command.");
}
}
interface IDatabaseUtils{
IConnection getConnection();
ICommand getCommand();
}
class MysqlDataBaseUtils implements IDatabaseUtils{

@Override
public IConnection getConnection() {
return new MySqlConnection();
}

@Override
public ICommand getCommand() {
return new MySqlCommand();
}
}
class OracleDataBaseUtils implements IDatabaseUtils{

@Override
public IConnection getConnection() {
return new OracleConnection();
}

@Override
public ICommand getCommand() {
return new OracleCommand();
}
}

应用场景:程序需要处理不同系列的相关产品,但是您不希望它依赖于这些产品的具体类时,可以使用抽象工厂。

优点

1.可以确信你从工厂的到的产品彼此是兼容的。

2.可以避免具体产品到客户端代码之间的紧密耦合。

3.符合单一职责原则。

4.符合开闭原则。

JDK源码中的应用:

1
2
java.sql.Conection;
java.sql.Driver;