小试工厂模式

在开发过程中,很多人钟情于if/else连环写法,举个简单的例子,一个页面有N个菜单,点击的时候通过枚举类型来进行业务逻辑跳转。那么通常会这么写:

1
2
3
4
5
6
7
8
- (void)handleJumpType:(ClJumpType)jumpType{
if(jumpType == CLJumpTypeAccount){
[self gotoAccountPage];
}else if(jumpType == CLJumpTypeAbout){
[self gotoAboutPage];
}
...
}

假如说有十几个枚举,那handleJumpType:方法就会看起来不是很优雅,如果条件有变化的话,不好扩展,而且业务代码牵一发动全身……

那么骚一点的程序员会怎么写呢?switch/case? 当然不是,我这里推荐使用工厂模式来优雅的处理类似的逻辑。

接下来我们就通过一系列的代码来演示如何通过工厂模式来处理这个问题。

废话不说了上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// 类型枚举
typedef NS_ENUM(NSUInteger, CLJumpType) {
CLJumpTypeAccount = 1,
CLJumpTypeAbout = 2,
...
}

// 点击事件基类
@interface CLJumpEvent : NSObject
- (instancetype)initWithType:(CLJumpType)jumpType;
- (void)jumpEvent;
@end

@interface CLJumpTypeEvent()
@property (nonatmoic, assign) CLJumpType jumpType;
@end

@implementation CLJumpTypeEvent
- (instancetype)initWithType:(CLJumpType)jumpType {
if ([self = super init]){
self.jumpType = jumpType;
}
return self;
}

- (void)jumpEvent {
NSLog(@"点击事件处理");
}
@end

// 跳转到我的账户
@interface CLJumpTypeAccount : CLJumpTypeEvent

@end

@implementation CLJumpTypeEvent
// 重写基类的jumpEvent方法
- (void)jumpEvent {
NSLog(@"跳转到我的账户页面...");
}

@end

// 跳转工厂类
@interface CLJumpFactory : NSObject
+ (CLJumpEvent)getJumpEvent:(CLJumpType)jumpType;
@end

@implementation CLJumpFactory

+ (NSDictionary)jumpEvents {
return @{
@(CLJumpTypeAccount):[[CLJumpTypeEvent alloc]initWithType:CLJumpTypeAccount],
@(CLJumpTypeAbout):[[CLJumpTypeEvent alloc]initWithType:CLJumpTypeAbout],
...
}
}

+ (CLJumpEvent)getJumpEvent:(CLJumpType)jumpType{
return [[self jumpEvents] objectForKey:@(jumpType)];
}

@end

到这里,我们的工厂定义完了,那么接下来改造一下上面的handleJumpType:方法:

1
2
3
4
- (void)handleJumpType:(ClJumpType)jumpType{
CLJumpTypeEvent *jumpEvent = [CLJumpFactory getJumpEvent:jumpType];
[jumpEvent jumpEvent];
}

OK,改造完的样子,是不是很优雅?而且如果需要扩展的话,handleJumpType:方法完全不用修改。

通过这个例子是不是觉得利用工厂模式来处理类似的问题十分的合适呢,其实设计模式在实际的开发中还是很有用的,只要我们仔细的去揣摩代码,你会发现它总有一些模式在里面。

谢谢您的支持!