美文网首页
iOS设计模式之工厂模式下(抽象工厂)

iOS设计模式之工厂模式下(抽象工厂)

作者: 点滴86 | 来源:发表于2024-04-24 22:39 被阅读0次

抽象工厂(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协议,创建对应的规则配置和系统配置的解析器。

相关文章

网友评论

      本文标题:iOS设计模式之工厂模式下(抽象工厂)

      本文链接:https://www.haomeiwen.com/subject/knwgxjtx.html