1. 什么是工厂方法模式?
工厂方法模式是由(1)抽象工厂(2)具体工厂(3)抽象产品(4)具体产品 四个部分组成的类创建型设计模式具体结构如下图所示
2. 怎么用?
2.1 工厂方法模式的适用环境
(1)客户端不知道所需要对象的类
(2)抽象工厂类通过子类指定创建哪个对象
2.2 具体使用上实例代码
以日志记录器为例设计结构如下
2.2.1 客户端
public class Client {
public static void main(String[] args) {
LoggerFactory factory;
Logger logger;
factory = (LoggerFactory) XMLUtil.getBean();
logger = factory.createLogger();
logger.writeLog();
}
}
2.2.2 抽象工厂类及其子类
//抽象工厂类
public interface LoggerFactory {
public Logger createLogger();
}
//数据库日志工厂类
public class DatabaseLoggerFactory implements LoggerFactory {
public Logger createLogger() {
//连接数据库,代码省略
//创建数据库日志记录器对象
Logger logger = new DatabaseLogger();
//初始化数据库日志记录器,代码省略
return logger;
}
}
//文件日志工厂类
public class FileLoggerFactory implements LoggerFactory {
public Logger createLogger() {
//创建文件日志记录器对象
Logger logger = new FileLogger();
//创建文件,代码省略
return logger;
}
}
2.2.3 抽象产品类及其子类
//抽象产品类
public interface Logger {
public void writeLog();
}
//数据库日志产品类
public class DatabaseLogger implements Logger {
public void writeLog() {
System.out.println("数据库日志记录");
}
}
//文件日志产品类
public class FileLogger implements Logger {
public void writeLog() {
System.out.println("文件日志记录");
}
}
2.2.4 xml配置文件及反射使用(补充)
配置文件
<?xml version="1.0"?> <config> <className>org.factorymethodpattern.logger.FileLoggerFactory</className> </config>
xml工具类
public class XMLUtil {
//该方法从xml配置文件中提取具体类的类名,并返回一个实例对象
public static Object getBean(){
try {
//创建DOM文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("src/main/java/org/factorymethodpattern/logger/config.xml"));
//获取包含类名的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode = nl.item(0).getFirstChild();
String cName = classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c = Class.forName(cName);
Object obj = c.newInstance();
return obj;
}
catch (Exception e){
e.printStackTrace();
return null;
}
}
}
3.1 个人感悟
设计原则是设计理念,设计模式是对于设计原则的应用,不同设计模式应用了不同的设计理念;工厂方法模式是对 开闭原则,里氏代换原则,依赖倒转原则的直观应用。
如果有不对的地方希望指正,共勉