定义
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
这样核心工厂类不再负责产品的创建,变成一个抽象工厂角色,仅负责具体工厂子类必须要实现的接口。这样进一步抽象的好处是系统在不修改具体工厂角色的情况下引进新的产品。
类图及角色
抽象工厂(Creator):工厂方法模式的核心,与应用程序无关。任何模式下创建的对象的工厂类都必须实现这个接口。
具体工厂(Concrete Creator):实现工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且接收客户端调用创建产品对象。
抽象产品(Product):工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
具体产品(Concrete Product):实现了抽象产品定义的接口。具体产品由具体工厂创建,它们之间一一对应。
案例代码
//日志系统,充当抽象产品角色
public interface Logger {
public void writeLog();
}
//文件日志记录器,充当具体产品角色
public class FileLogger implements Logger {
@Override
public void writeLog() {
System.out.println("文件日志记录");
}
}
//数据库日志记录器,充当具体产品角色
public class DatabaseLogger implements Logger {
@Override
public void writeLog() {
System.out.println("数据库日志记录");
}
}
//日志记录器工厂接口,充当抽象工厂角色
public interface LoggerFactory {
public Logger createLogger();
}
//文件日志工厂
public class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
Logger logger = new FileLogger();
return logger;
}
}
//数据库日志工厂
public class DatabaseLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
Logger logger = new DatabaseLogger();
return logger;
}
}
//客户端
public class Client {
public static void main(String[] args) {
LoggerFactory factory1 = new FileLoggerFactory();
Logger logger1 = factory1.createLogger();
logger1.writeLog();
LoggerFactory factory2 = new DatabaseLoggerFactory();
Logger logger2 = factory2.createLogger();
logger2.writeLog();
}
}
简单工厂模式和工厂方法模式的对比
简单工厂模式又叫静态工厂模式,它用来实例化目标类的静态类。简单工厂是不完全满足OCP。最大的区别:简单工厂模式只有一个工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
优点
- 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户端隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需要产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。
- 基于工厂角色和产品角色的多态性设计是工厂方法的关键,他能够让工厂模式自主的创建产品对象,而如何创建这个对象的细节完全封装在工厂类。
- 使用工厂方法模式最大的优点就是新加类的时候不用动源代码,只要写新的产品新的工厂来继承对应的类就行了。
缺点
- 结构复杂度。
- 代码复杂度。
- 客户端编程复杂度。
- 管理复杂度。
如:当多个产品需要修改时,简单工厂模式仍然仅仅修改唯一的工厂类,而工厂模式需要修改很多的类。