目录与学习目标
1:为什么需要抽象工厂 2:如何实现抽象工厂
1:为什么需要抽象工厂
简单工厂和工厂方法中,类只有一种分类方式。比如,在规则配置解析那个例子中,解析器类只会根据配置文件格式(Yaml 、Propertie 、Json、Xml、……)来分类。但是,如果类有两种分类方式,比如,我们既可以按照配置文件格式来分类,也可以按照解析的对象(Rule 规则配置还是 System 系统配置)来分类,那就会对应下面这 8 个 parser 类。针对规则配置的解析器:基于接口IRuleConfigParserYamlRuleConfigParserPropertiesRuleConfigParserJsonRuleConfigParserXmlRuleConfigParser针对系统配置的解析器:基于接口ISystemConfigParser YamlSystemConfigParserPropertiesSystemConfigParserJsonSystemConfigParserXmlSystemConfigParser针对这种特殊的场景,如果还是继续用工厂方法来实现的话,我们要针对每个 parser 都编写一个工厂类,也就是要编写 8 个工厂类。抽象工厂就是针对这种非常特殊的场景而诞生的。我们可以让一个工厂负责创建多个不同类型的对象(IRuleConfigParser、ISystemConfigParser 等),而不是只创建一种 parser 对象。
2:如何实现抽象工厂
public interface IConfigParserFactory { IRuleConfigParser createRuleParser(); ISystemConfigParser createSystemParser(); //此处可以扩展新的parser类型,比如IBizConfigParser}public class YamlConfigParserFactory implements IConfigParserFactory { @Override public IRuleConfigParser createRuleParser() { return new YamlConfigParser(); } @Override public ISystemConfigParser createSystemParser() { return new YamlSystemConfigParser(); }}public class PropertiesConfigParserFactory implements IConfigParserFactory { @Override public IRuleConfigParser createRuleParser() { return new PropertiesRuleConfigParser(); } @Override public ISystemConfigParser createSystemParser() { return new PropertiesSystemConfigParser(); }}// 省略JsonConfigParserFactory和XmlConfigParserFactory代码