简单工厂模式固然好用,但是也存在很多缺点。由于创建对象是静态的,而且工厂是公共的,并且存在判断逻辑,当类多了以后,会造成代码的冗余,不利于扩展,每次扩展,都需要修改工厂类中的判断逻辑,不符合“开闭原则”,基于这种现状,引申出工厂方法模式。
public interface Logger {
void writeLog();
}
public class DatabaseLogger implements Logger {
@Override
public void writeLog() {
System.out.println("DatabaseLogger");
}
}
public class FileLogger implements Logger {
@Override
public void writeLog() {
System.out.println("FileLogger");
}
}
public interface LoggerFactory {
Logger createLogger();
}
public class DatabaseLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
Logger logger = new DatabaseLogger();
return logger;
}
}
public class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
Logger logger = new FileLogger();
return logger;
}
}
通过类图和代码,再对比上一篇简单工厂的博客可以发现,工厂方法模式在简单工厂方法上又做了一层抽取,在使用起来更为灵活,具工厂搭配具体产品,不需要再像简单工厂那样通过if...else...去判断到底创建哪个对象。
工厂方法有如下几个概念,分别是:抽象产品(Product)、具体产品(ConcreteProduct)、抽象工厂(Factory)、具体工厂(ConcreteFactory),相比于简单工厂,多了抽象工厂和具体工厂这层概念。