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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
| // 抽象产品 - 日志记录器接口
interface Logger {
void log(String level, String message);
void info(String message);
void error(String message);
void debug(String message);
}
// 具体产品 - 文件日志记录器
class FileLogger implements Logger {
private String filename;
public FileLogger(String filename) {
this.filename = filename;
}
@Override
public void log(String level, String message) {
String logEntry = String.format("[%s] %s: %s",
new Date().toString(), level, message);
System.out.println("写入文件 " + filename + ": " + logEntry);
}
@Override
public void info(String message) { log("INFO", message); }
@Override
public void error(String message) { log("ERROR", message); }
@Override
public void debug(String message) { log("DEBUG", message); }
}
// 具体产品 - 控制台日志记录器
class ConsoleLogger implements Logger {
private String prefix;
public ConsoleLogger(String prefix) {
this.prefix = prefix;
}
@Override
public void log(String level, String message) {
System.out.println(String.format("[%s][%s] %s: %s",
prefix, new Date().toString(), level, message));
}
@Override
public void info(String message) { log("INFO", message); }
@Override
public void error(String message) { log("ERROR", message); }
@Override
public void debug(String message) { log("DEBUG", message); }
}
// 具体产品 - 数据库日志记录器
class DatabaseLogger implements Logger {
private String tableName;
public DatabaseLogger(String tableName) {
this.tableName = tableName;
}
@Override
public void log(String level, String message) {
String sql = String.format("INSERT INTO %s (level, message, timestamp) VALUES ('%s', '%s', '%s')",
tableName, level, message, new Date().toString());
System.out.println("数据库记录日志:" + sql);
}
@Override
public void info(String message) { log("INFO", message); }
@Override
public void error(String message) { log("ERROR", message); }
@Override
public void debug(String message) { log("DEBUG", message); }
}
// 抽象工厂 - 日志工厂
abstract class LoggerFactory {
public abstract Logger createLogger();
// 便捷的静态工厂方法
public static LoggerFactory getFactory(String type, String config) {
switch (type.toLowerCase()) {
case "file":
return new FileLoggerFactory(config);
case "console":
return new ConsoleLoggerFactory(config);
case "database":
return new DatabaseLoggerFactory(config);
default:
throw new IllegalArgumentException("未知的日志类型: " + type);
}
}
}
// 具体工厂实现
class FileLoggerFactory extends LoggerFactory {
private String filename;
public FileLoggerFactory(String filename) {
this.filename = filename;
}
@Override
public Logger createLogger() {
return new FileLogger(filename);
}
}
class ConsoleLoggerFactory extends LoggerFactory {
private String prefix;
public ConsoleLoggerFactory(String prefix) {
this.prefix = prefix;
}
@Override
public Logger createLogger() {
return new ConsoleLogger(prefix);
}
}
class DatabaseLoggerFactory extends LoggerFactory {
private String tableName;
public DatabaseLoggerFactory(String tableName) {
this.tableName = tableName;
}
@Override
public Logger createLogger() {
return new DatabaseLogger(tableName);
}
}
// 应用程序示例
public class LoggerFactoryDemo {
public static void main(String[] args) {
// 根据配置创建不同类型的日志记录器
String logType = "file"; // 可以从配置文件读取
String logConfig = "application.log";
LoggerFactory factory = LoggerFactory.getFactory(logType, logConfig);
Logger logger = factory.createLogger();
logger.info("应用程序启动");
logger.debug("调试信息:初始化完成");
logger.error("发生错误:连接数据库失败");
// 切换到控制台日志
LoggerFactory consoleFactory = LoggerFactory.getFactory("console", "MyApp");
Logger consoleLogger = consoleFactory.createLogger();
consoleLogger.info("切换到控制台日志");
consoleLogger.debug("这是控制台调试信息");
// 使用数据库日志
LoggerFactory dbFactory = LoggerFactory.getFactory("database", "application_logs");
Logger dbLogger = dbFactory.createLogger();
dbLogger.info("数据库日志记录");
dbLogger.error("数据库错误日志");
}
}
|