抽象工厂(Abstract Factory)
在规则配置解析的例子中,解析器类只会根据配置文件格式(Json、Xml、Properties)来分类。但是,如果类有两种分类方式,比如既可以按照配置文件格式分类,也可以按照解析的对象来分类,那就会对应下面6个parser类。
// 针对规则配置的解析器:基于DMRuleConfigParser协议
DMJsonRuleConfigParser
DMXmlRuleConfigParser
DMPropertiesRuleConfigParser
// 针对系统配置的解析器:基于DMSystemConfigParser协议
DMJsonSystemConfigParser
DMXmlSystemConfigParser
DMPropertiesSystemConfigParser
针对这种特殊的场景,如果还是继续用工厂方法来实现的话,就要针对每个parser都编写一个工厂类,也就是要编写6个工厂类。如果未来还要继续增加针对业务配置的解析器,那就要再相应的增加3个工厂类。过多的类也会让系统难以维护,抽象工厂就是针对这种非常特殊的场景诞生的。可以让一个工厂负责创建多个不同类型的对象(DMRuleConfigParser、DMSystemConfigParser等),而不是只创建一种parser对象。这样就可以有效地减少工厂类的个数。代码实现如下:
@protocol DMRuleConfigParser <NSObject>
- (DMRuleConfig *)parse:(NSString *)configStr;
@end
@interface DMJsonRuleConfigParser : NSObject <DMRuleConfigParser>
@end
@implementation DMJsonRuleConfigParser
- (DMRuleConfig *)parse:(NSString *)configStr
{
DMRuleConfig *ruleConfig = [[DMRuleConfig alloc] init];
/*
省略解析
*/
return ruleConfig;
}
@end
@interface DMXmlRuleConfigParser : NSObject <DMRuleConfigParser>
@end
@implementation DMXmlRuleConfigParser
- (DMRuleConfig *)parse:(NSString *)configStr
{
DMRuleConfig *ruleConfig = [[DMRuleConfig alloc] init];
/*
省略解析
*/
return ruleConfig;
}
@end
@interface DMPropertiesRuleConfigParser : NSObject <DMRuleConfigParser>
@end
@implementation DMPropertiesRuleConfigParser
- (DMRuleConfig *)parse:(NSString *)configStr
{
DMRuleConfig *ruleConfig = [[DMRuleConfig alloc] init];
/*
省略解析
*/
return ruleConfig;
}
@end
@protocol DMSystemConfigParser <NSObject>
- (DMSystemConfig *)parser:(NSString *)configStr;
@end
@interface DMJsonSystemConfigParser : NSObject <DMSystemConfigParser>
@end
@implementation DMJsonSystemConfigParser
- (DMSystemConfig *)parser:(NSString *)configStr
{
DMSystemConfig *systemConfig = [[DMSystemConfig alloc] init];
/*
省略解析
*/
return systemConfig;
}
@end
@interface DMXmlSystemConfigParser : NSObject <DMSystemConfigParser>
@end
@implementation DMXmlSystemConfigParser
- (DMSystemConfig *)parser:(NSString *)configStr
{
DMSystemConfig *systemConfig = [[DMSystemConfig alloc] init];
/*
省略解析
*/
return systemConfig;
}
@end
@interface DMPropertiesSystemConfigParser : NSObject <DMSystemConfigParser>
@end
@implementation DMPropertiesSystemConfigParser
- (DMSystemConfig *)parser:(NSString *)configStr
{
DMSystemConfig *systemConfig = [[DMSystemConfig alloc] init];
/*
省略解析
*/
return systemConfig;
}
@end
@protocol DMConfigParserFactory <NSObject>
- (id<DMRuleConfigParser>)createRuleConfigParser;
- (id<DMSystemConfigParser>)createSystemConfigParser;
@end
@interface DMJsonConfigParserFactory : NSObject <DMConfigParserFactory>
@end
@implementation DMJsonConfigParserFactory
- (id<DMRuleConfigParser>)createRuleConfigParser
{
return [[DMJsonRuleConfigParser alloc] init];
}
- (id<DMSystemConfigParser>)createSystemConfigParser
{
return [[DMJsonSystemConfigParser alloc] init];
}
@end
@interface DMXmlConfigParserFactory : NSObject <DMConfigParserFactory>
@end
@implementation DMXmlConfigParserFactory
- (id<DMRuleConfigParser>)createRuleConfigParser
{
return [[DMXmlRuleConfigParser alloc] init];
}
- (id<DMSystemConfigParser>)createSystemConfigParser
{
return [[DMXmlSystemConfigParser alloc] init];
}
@end
@interface DMPropertiesConfigParserFactory : NSObject <DMConfigParserFactory>
@end
@implementation DMPropertiesConfigParserFactory
- (id<DMRuleConfigParser>)createRuleConfigParser
{
return [[DMPropertiesRuleConfigParser alloc] init];
}
- (id<DMSystemConfigParser>)createSystemConfigParser
{
return [[DMPropertiesSystemConfigParser alloc] init];
}
@end
DMConfigParserFactory协议两个方法,创建- (id<DMRuleConfigParser>)createRuleConfigParser和创建- (id<DMSystemConfigParser>)createSystemConfigParser,DMJsonConfigParserFactory、DMXmlConfigParserFactory、DMPropertiesConfigParserFactory都遵守DMConfigParserFactory协议,创建对应的规则配置和系统配置的解析器。
网友评论