定义:提供一个创建对象实例的功能,而无需关心其具体实现
本质:选择实现
下面通过具体实例来说明静态工厂的含义、适用场景
-----------------------------------------------------------------------------------------------------------
Web应用开发中,log日志的写入几乎是每个项目都会遇到的功能,我们以此引入静态工厂
首先定义一个接口:LogApi
public interface LogApi{
public void writeLog();
}
接口内申明一个写入日志的方法,该方法可以为不同的实现类复写
假设日志可以写入数据库或者是文件,我们提供两种不同的实现
数据库实现:
public class DbLogApi implements LogApi {
@Override
public void writeLog() {
System.out.println("write log to db...");
}
}
文件实现:
public class FileLogApi implements LogApi {
@Override
public void writeLog() {
System.out.println("write log to file...");
}
}
有了这两种实现,我们就有了一个选择性,这个选择性是通过一个单独的factory类来实现,该类提供一个静态方法,静态方法可以通过接收不同的参数内容,返回相应的具体实现。
public class LogFactory {
public static LogApi getInstance(String type){
if("db".equals(type)){
return new DbLogApi();
}else if("file".equals(type)){
return new FileLogApi();
}else{
try {
throw new Exception("非法的日志类型");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
}
测试类:
public class Test {
public static void main(String[] args) {
LogApi api1 = LogFactory.getInstance("file");
api1.writeLog();
LogApi api2 = LogFactory.getInstance("db");
api2.writeLog();
LogApi api3 = LogFactory.getInstance("otherType");
api3.writeLog();
}
}
测试类分别接收了file db otherType三个参数,LogFactory#getInstance方法分别做出了三种不同的处理。
运行结果如下:
write log to file...
write log to db...
java.lang.Exception: 非法的日志类型
at com.pattern.simplefactory.LogFactory.getInstance(LogFactory.java:12)
at com.pattern.simplefactory.Test.main(Test.java:11)
Exception in thread "main" java.lang.NullPointerException
at com.pattern.simplefactory.Test.main(Test.java:12)