1. 引言
大家好,又见面了!在上一篇文章中,我们通过Python示例介绍了简单工厂模式,今天,我们继续深入这个话题,用Java来实现简单工厂模式。
2. 什么是简单工厂模式
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它定义一个工厂类,根据传入的参数决定创建哪一种产品类的实例。简单来说,简单工厂模式就是把创建对象的任务交给一个专门的工厂类,让工厂来决定生产哪种对象,咱们只需安心享用即可。
3. 简单工厂模式的实现(Java)
示例一:形状工厂
假如你是个艺术家,需要画各种形状,圆形、方形啥的,你可以用简单工厂模式让工厂帮你搞定这些形状对象:
代码实现
// 定义Shape接口
public interface Shape {
void draw();
}
// 实现Circle类
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
// 实现Square类
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Drawing a Square");
}
}
// 实现ShapeFactory工厂类
public class ShapeFactory {
public static Shape createShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("SQUARE")) {
return new Square();
}
return null;
}
}
// 使用示例
public class FactoryPatternDemo {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// 获取 Circle 对象并调用其 draw 方法
Shape shape1 = shapeFactory.createShape("CIRCLE");
shape1.draw(); // 输出: Drawing a Circle
// 获取 Square 对象并调用其 draw 方法
Shape shape2 = shapeFactory.createShape("SQUARE");
shape2.draw(); // 输出: Drawing a Square
}
}
详细代码解析
Shape
是一个接口,定义了draw
方法;Circle
和Square
类实现了Shape
接口,具体画啥样子它们说了算;ShapeFactory
类有一个静态方法createShape
,根据传入的形状类型参数创建并返回对应的形状对象;- 我们只需通过调用
ShapeFactory.createShape
方法并传入形状类型,就能轻松得到相应的形状对象。
示例二:日志记录器工厂
现在你是个开发者,搞个日志系统,你想要不同级别的日志记录器来帮你分门别类记录信息,简单工厂模式也能派上用场:
代码实现
// 定义Logger接口
public interface Logger {
void log(String message);
}
// 实现InfoLogger类
public class InfoLogger implements Logger {
@Override
public void log(String message) {
System.out.println("INFO: " + message);
}
}
// 实现ErrorLogger类
public class ErrorLogger implements Logger {
@Override
public void log(String message) {
System.out.println("ERROR: " + message);
}
}
// 实现LoggerFactory工厂类
public class LoggerFactory {
public static Logger createLogger(String loggerType) {
if (loggerType == null) {
return null;
}
if (loggerType.equalsIgnoreCase("INFO")) {
return new InfoLogger();
} else if (loggerType.equalsIgnoreCase("ERROR")) {
return new ErrorLogger();
}
return null;
}
}
// 使用示例
public class FactoryPatternDemo {
public static void main(String[] args) {
LoggerFactory loggerFactory = new LoggerFactory();
// 获取 InfoLogger 对象并调用其 log 方法
Logger infoLogger = loggerFactory.createLogger("INFO");
infoLogger.log("This is an informational message."); // 输出: INFO: This is an informational message.
// 获取 ErrorLogger 对象并调用其 log 方法
Logger errorLogger = loggerFactory.createLogger("ERROR");
errorLogger.log("This is an error message."); // 输出: ERROR: This is an error message.
}
}
详细代码解析
Logger
是一个接口,定义了log
方法;InfoLogger
和ErrorLogger
类实现了Logger
接口,分别负责记录不同级别的日志;LoggerFactory
类的静态方法createLogger
根据传入的日志类型参数创建并返回对应的日志记录器对象;- 你只需通过调用
LoggerFactory.createLogger
方法并传入日志类型参数,就能得到相应的日志记录器对象。
4. 简单工厂模式的应用场景和实例
示例三:数据库连接工厂
假如你现在是个DBA,需要管理多个数据库连接,简单工厂模式同样能帮你搞定这个问题:
代码实现
// 定义DatabaseConnection接口
public interface DatabaseConnection {
void connect();
}
// 实现MySQLConnection类
public class MySQLConnection implements DatabaseConnection {
@Override
public void connect() {
System.out.println("Connecting to MySQL database...");
}
}
// 实现PostgreSQLConnection类
public class PostgreSQLConnection implements DatabaseConnection {
@Override
public void connect() {
System.out.println("Connecting to PostgreSQL database...");
}
}
// 实现DatabaseConnectionFactory工厂类
public class DatabaseConnectionFactory {
public static DatabaseConnection createConnection(String dbType) {
if (dbType == null) {
return null;
}
if (dbType.equalsIgnoreCase("MYSQL")) {
return new MySQLConnection();
} else if (dbType.equalsIgnoreCase("POSTGRESQL")) {
return new PostgreSQLConnection();
}
return null;
}
}
// 使用示例
public class FactoryPatternDemo {
public static void main(String[] args) {
DatabaseConnectionFactory dbFactory = new DatabaseConnectionFactory();
// 获取 MySQLConnection 对象并调用其 connect 方法
DatabaseConnection mysqlConnection = dbFactory.createConnection("MYSQL");
mysqlConnection.connect(); // 输出: Connecting to MySQL database...
// 获取 PostgreSQLConnection 对象并调用其 connect 方法
DatabaseConnection postgresqlConnection = dbFactory.createConnection("POSTGRESQL");
postgresqlConnection.connect(); // 输出: Connecting to PostgreSQL database...
}
}
详细代码解析
DatabaseConnection
是一个接口,定义了connect
方法;MySQLConnection
和PostgreSQLConnection
类实现了DatabaseConnection
接口,分别负责不同数据库的连接;DatabaseConnectionFactory
类的静态方法createConnection
根据传入的数据库类型参数创建并返回对应的数据库连接对象;- 你只需通过调用
DatabaseConnectionFactory.createConnection
方法并传入数据库类型参数,就能得到相应的数据库连接对象。
5. 简单工厂模式的优缺点
优点
- 解耦:把对象的创建过程封装在工厂类里,客户端代码只需关心怎么用,不用关心怎么创建;
- 灵活性:通过工厂类可以灵活地创建不同类型的对象,扩展性杠杠的。
缺点
- 违背开闭原则:每次新增对象类型,都得改工厂类,比较麻烦;
- 单一职责问题:工厂类负责创建所有对象,复杂项目里可能会比较臃肿。
6.示意图(图片来源:https://xie.infoq.cn/article/270b6bbfd752d9906bf0a09df)
7. 总结
简单工厂模式就是这么神奇,它让对象的创建变得简单又高效,适用于各种需要灵活创建对象的场景。虽然它有一些缺点,但在大多数情况下,简单工厂模式依然是个非常实用的设计模式。希望今天的分享能让大家对简单工厂模式有更深入的理解,如果你在项目中也用到了简单工厂模式,欢迎留言分享你的经验和见解!