抽象工厂模式(Abstract Factory Pattern),顾名思义,是对工厂的抽象。是工厂方法模式的进一步抽象。也可以说是对工厂方法模式的包装。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
先来看一下UML图:
- 第一种实现:
要创建的最终的Bean的UML图:
- 第二种实现
类图:
可以看到,就是使用FactoryCreator来创建不同类型的工厂类。创建了工厂类了之后的逻辑与工厂方法中的一致。有疑问可以去看上一篇工厂方法模式。
方式1适合创建类的种类很多的情况。
方式2则是有点类似工厂方法。这是对工厂方法进行了一层包装。
方式2在日志模块有很好的应用:
如下是org.slf4j.LoggerFactory#getLogger(String name)方法。
public static Logger getLogger(String name) {
//获取不同类型日志实现的工厂实例
//系统使用logback时,实现的工厂类是LoggerContext
ILoggerFactory iLoggerFactory = getILoggerFactory();
//再从工厂实例中获取具体的日志的实例
return iLoggerFactory.getLogger(name);
}
这个例子中:
- org.slf4j.LoggerFactory对应图中FactoryCreator
- ILoggerFactory对应IFactory
- LoggerContext对应BeanXFactroy
设计模式的精髓在于真对变化的变化,千万不能生搬硬套。照葫芦画瓢。如上在slf4j日志的这个场景的实现中就对这个进行了优化。可以动态获取class包中的日志实现工厂类。但是再其他的一些场景getILoggerFactory()方法中又可以加参数,指定获取哪一种Bean的工厂类。