简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了“开闭原则”。此外,在简单工厂模式中,所有的产品都由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式。
工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。工厂方法模式结构如图所示:
产品接口
public interface Logger {
void writeLog();
}
产品实现类1
public class FileLogger implements Logger {
@Override
public void writeLog() {
System.out.println("写文件Log");
}
}
产品实现类2
public class DatabaseLogger implements Logger {
@Override
public void writeLog() {
System.out.println("写数据库log");
}
}
工厂接口
public interface LoggerFactory {
Logger createLogger();
//重载的工厂方法
Logger createLogger(String args);
//使用该函数可隐藏工厂方法
void writeLog();
}
工厂实现类1
public class FileLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
Logger logger = new FileLogger();
//进行相应的初始化操作
return logger;
}
@Override
public Logger createLogger(String args) {
return null;
}
@Override
public void writeLog() {
Logger logger = new FileLogger();
logger.writeLog();
}
}
工厂实现类2
public class DatabaseLoggerFactory implements LoggerFactory {
@Override
public Logger createLogger() {
Logger logger = new DatabaseLogger();
//进行相应的初始化操作
return logger;
}
@Override
public Logger createLogger(String args) {
return null;
}
@Override
public void writeLog() {
Logger logger = new DatabaseLogger();
logger.writeLog();
}
}
测试类
public class Test {
public static void main(String[] args) {
//这边可以利用反射从配置文件读取类名来获得具体的类
//Class c=Class.forName(cName);
//Object obj=c.newInstance();
//调用工厂方法
LoggerFactory loggerFactory = new FileLoggerFactory();
Logger logger = loggerFactory.createLogger();
logger.writeLog();
//可在工厂接口中提供产品具体的函数来隐藏工厂方法的调用
LoggerFactory loggerFactory2 = new DatabaseLoggerFactory();
loggerFactory2.writeLog();
}
}
//写文件Log
//写数据库log
原文:https://www.cnblogs.com/ading-blog/p/9663438.html