2022-10-31 23:01:42 +08:00
|
|
|
|
### 简述
|
|
|
|
|
|
2022-11-01 22:25:35 +08:00
|
|
|
|
抽象工厂模式的应用场景比较特殊,没有简单工厂和工厂方法常用。
|
|
|
|
|
|
|
|
|
|
### 示例①
|
|
|
|
|
|
|
|
|
|
继续以规则配置解析作为例子进行解释
|
|
|
|
|
|
|
|
|
|
在工厂方法规则配置解析那个例子中,解析器类只会根据配置文件格式(Json、Xml、Yaml……)来分类。但是,如果类有两种分类方式,比如,我们既可以按照配置文件格式来分类,也可以按照解析的对象(Rule 规则配置还是 System 系统配置)来分类,那就会对应下面这 8 个 parser 类。
|
|
|
|
|
|
|
|
|
|
| 文件格式\配置方式 | IRuleConfigParser | ISystemConfigParser |
|
|
|
|
|
| ----------------- | -------------------------- | ---------------------------- |
|
|
|
|
|
| Json | JsonRuleConfigParser | JsonSystemConfigParser |
|
|
|
|
|
| Xml | XmlRuleConfigParser | XmlSystemConfigParser |
|
|
|
|
|
| Yaml | YamlRuleConfigParser | YamlSystemConfigParser |
|
|
|
|
|
| Properties | PropertiesRuleConfigParser | PropertiesSystemConfigParser |
|
|
|
|
|
|
|
|
|
|
针对这种特殊的场景,如果还是继续用工厂方法来实现的话,我们要针对每个 parser 都编写一个工厂类,也就是要编写 8 个工厂类。如果我们未来还需要增加针对业务配置的解析器(比如 IBizConfigParser见下方表格),那就要再对应地增加 4 个工厂类。而这样过多的类只会让我们的系统越来越难维护。
|
|
|
|
|
|
|
|
|
|
| 文件类型 | IRuleConfigParser | ISystemConfigParser | IBizConfigParser |
|
|
|
|
|
| ---------- | -------------------------- | ---------------------------- | ------------------------- |
|
|
|
|
|
| Json | JsonRuleConfigParser | JsonSystemConfigParser | JsonBizConfigParser |
|
|
|
|
|
| Xml | XmlRuleConfigParser | XmlSystemConfigParser | XmlBizConfigParser |
|
|
|
|
|
| Yaml | YamlRuleConfigParser | YamlSystemConfigParser | YamlBizConfigParser |
|
|
|
|
|
| Properties | PropertiesRuleConfigParser | PropertiesSystemConfigParser | PropertiesBizConfigParser |
|
|
|
|
|
|
|
|
|
|
### 抽象工厂(Abstract Factory)
|
|
|
|
|
|
|
|
|
|
抽象工厂就是针对这种非常特殊的场景而诞生的。我们可以让一个工厂负责创建多个不同类型的对象(IRuleConfigParser、ISystemConfigParser 等),这样就可以有效地减少工厂类的个数。具体的代码实现如下所示:
|
|
|
|
|
|
|
|
|
|
```java
|
|
|
|
|
|
|
|
|
|
public interface IConfigParserFactory {
|
|
|
|
|
IRuleConfigParser createRuleParser();
|
|
|
|
|
ISystemConfigParser createSystemParser();
|
|
|
|
|
//此处可以扩展新的parser类型,比如IBizConfigParser
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class JsonConfigParserFactory implements IConfigParserFactory {
|
|
|
|
|
@Override
|
|
|
|
|
public IRuleConfigParser createRuleParser() {
|
|
|
|
|
return new JsonRuleConfigParser();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public ISystemConfigParser createSystemParser() {
|
|
|
|
|
return new JsonSystemConfigParser();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public class XmlConfigParserFactory implements IConfigParserFactory {
|
|
|
|
|
@Override
|
|
|
|
|
public IRuleConfigParser createRuleParser() {
|
|
|
|
|
return new XmlRuleConfigParser();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public ISystemConfigParser createSystemParser() {
|
|
|
|
|
return new XmlSystemConfigParser();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 省略YamlConfigParserFactory和PropertiesConfigParserFactory代码
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 总结
|
|
|
|
|
|
|
|
|
|
相比工厂方法抽象工厂可以让一个工厂生产不同类型的对象,抽象工厂更适合根据多种特征分类,不会因为多种特征去分别创建不同的抽象工厂
|