常用设计模式 工厂模式

bancheng发布

前言

工厂模式在iOS过程中使用频率是一个使用频率比较高的设计模式。一般如一下处理流程的都可以使用工程模式

BFD55F97AAA643F214237149A8EAABC9.jpg
该流程中的黑盒处理模块就可以使用工厂模式来处理。
列如有这样一个需求:用户输入一个字符串后,然后选择不同的文字风格。程序会将用户输入的字符串加工成不同风格显示给用户。
前期风格样式不多的时候我们只要在用户选择的方法里面用 if… else if…. 语句就能够处理。随着风格的增多 if… else if….模块会越来越沉重,越来越难以维护。 这时候工厂设计模式就能帮你来排忧解难了。

介绍

意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

主要解决:主要解决接口选择的问题。

何时使用:我们明确地计划不同条件下创建不同实例时。

如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。

注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

6AD434B0D47F522A42AFA314B0645F3D.jpg
示例:用户输入一个字符串,然后选择字符串的风格操作后。风格化功能将字符串风格化然后再展示给用户
1、首先定义好 工厂接口,和 风格样式

typedef NS_ENUM(NSInteger,StringStyle)
{
    StringStyleLine,  // 划线
    StringStyleItalic,//斜体
    StringStyleBord, //加粗
};
@class NSString;

@protocol StringStyleAble<NSObject>
//设置原始字符串
- (void) setOriginString:(NSString *)string;
//获取处理后的字符串
- (NSString *) getStyleString;
@end
@protocol StringStyleFactory<NSObject>

- (id<StringStyleAble>)getStyleInterfaceWitStyle:(StringStyle) style;
@end

2、工厂类的实现

- (id<StringStyleAble>)getStyleInterfaceWitStyle:(StringStyle)style
{
    if (style == StringStyleLine)
    {
        return  [[LineStyleHandler alloc] init];
    }
    else if (style == StringStyleItalic)
    {
        return [[ItalicHandler alloc] init];
    }
    else if (style == StringStyleBord)
    {
        return [[BordHandler alloc] init];
    }
    return nil;
}

3、各个 字符串风格处理类的实现

//-------------------------斜体风格-----------------------
@interface ItalicHandler()
@property(nonatomic,strong)NSString * originStr;
@end
@implementation ItalicHandler
//设置原始字符串
- (void) setOriginString:(NSString *)string
{
    self.originStr  = string;
}
//获取处理后的字符串
- (NSString *) getStyleString
{
    NSLog(@"对字符串进行斜体处理");
    return @"";
}

//-------------------------划线风格-----------------------

@interface LineStyleHandler()
@property(nonatomic,strong)NSString * originStr;
@end

@implementation LineStyleHandler
//设置原始字符串
- (void) setOriginString:(NSString *)string
{
    self.originStr  = string;
}
//获取处理后的字符串
- (NSString *) getStyleString
{
    NSLog(@"对字符串进划线处理处理");
    return @"";
}
//-------------------------加粗风格-----------------------

@interface BordHandler()
@property(nonatomic,strong)NSString * originStr;
@end
@implementation BordHandler
//设置原始字符串
- (void) setOriginString:(NSString *)string
{
    self.originStr  = string;
}
//获取处理后的字符串
- (NSString *) getStyleString
{
    NSLog(@"对字符串进行加粗处理");
    return @"";
}

扩展

1、在工厂类的方法中 还是存在有 if … else if…的代码,当随着业务的加深 if…else if…也会越来越沉重。

解决方法: 构建一个 style
和每个style风格对应的类名map。然后用类的反射来创建对象。

2、真实的业务可能没这么简单,比如有一种混合的风格,(划线和加粗混合)。这样的话混合风格的方法在1的解决方法又出现了限制。
解决方法:各个风格类使用的创建装饰模式,然后在1的map中配置style — 装饰链类 的map 就可以解决了

demo地址


bancheng

iOS开发者一枚,现就职中国北京。在这里记录自己开发遇到的问题和学习记录的笔记。喜欢学习、摄影。

1 条评论

bancheng · 2018年8月11日 上午12:45

厉害了

发表评论

电子邮件地址不会被公开。 必填项已用*标注