目录与学习目标

  1. 1:为什么需要抽象工厂
  2. 2:如何实现抽象工厂

1:为什么需要抽象工厂

  1. 简单工厂和工厂方法中,类只有一种分类方式。
  2. 比如,在规则配置解析那个例子中,解析器类只会根据配置文件格式(Yaml Propertie JsonXml、……)来分类。
  3. 但是,如果类有两种分类方式,
  4. 比如,我们既可以按照配置文件格式来分类,也可以按照解析的对象(Rule 规则配置还是 System 系统配置)来分类,那就会对应下面这 8 parser 类。
  5. 针对规则配置的解析器:基于接口IRuleConfigParser
  6. YamlRuleConfigParser
  7. PropertiesRuleConfigParser
  8. JsonRuleConfigParser
  9. XmlRuleConfigParser
  10. 针对系统配置的解析器:基于接口ISystemConfigParser
  11. YamlSystemConfigParser
  12. PropertiesSystemConfigParser
  13. JsonSystemConfigParser
  14. XmlSystemConfigParser
  15. 针对这种特殊的场景,如果还是继续用工厂方法来实现的话,我们要针对每个 parser 都编写一个工厂类,也就是要编写 8 个工厂类。
  16. 抽象工厂就是针对这种非常特殊的场景而诞生的。
  17. 我们可以让一个工厂负责创建多个不同类型的对象(IRuleConfigParserISystemConfigParser 等),而不是只创建一种 parser 对象。

2:如何实现抽象工厂

  1. public interface IConfigParserFactory {
  2. IRuleConfigParser createRuleParser();
  3. ISystemConfigParser createSystemParser();
  4. //此处可以扩展新的parser类型,比如IBizConfigParser
  5. }
  6. public class YamlConfigParserFactory implements IConfigParserFactory {
  7. @Override
  8. public IRuleConfigParser createRuleParser() {
  9. return new YamlConfigParser();
  10. }
  11. @Override
  12. public ISystemConfigParser createSystemParser() {
  13. return new YamlSystemConfigParser();
  14. }
  15. }
  16. public class PropertiesConfigParserFactory implements IConfigParserFactory {
  17. @Override
  18. public IRuleConfigParser createRuleParser() {
  19. return new PropertiesRuleConfigParser();
  20. }
  21. @Override
  22. public ISystemConfigParser createSystemParser() {
  23. return new PropertiesSystemConfigParser();
  24. }
  25. }
  26. // 省略JsonConfigParserFactory和XmlConfigParserFactory代码