工厂模式: 简而言之,假如有这样一个汽车工厂,不管你需要那种品牌的车,都可以为你生产出来。
好处是啥?
因为这样做太酷了!
实现这个工厂!
首先,定义一个汽车工厂类,取名LYCarFactory:
.h 中的内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@interface LYCarFactory : NSObject
//每辆车都遵守这个代理
@property (nonatomic,weak) id<LYCarDelegate> delegate;
//根据 传入品牌 枚举 构建不同的车
+ (LYCarFactory *)carWithBrand:(LYCarBrand)brand;
//给车一个方法,可以让它跑
- (void)run;
//给车几个属性方法,我们可以直达它的价格个品牌
- (double)price;//价格
- (NSString *)brandName;//品牌名
@end
设计一个品牌的枚举:
1
2
3
4
5
typedef NS_ENUM(NSInteger,LYCarBrand){
LYCarBrandFerrari,//法拉利
LYCarBrandLamborghini,//兰博基尼
LYCarBrandBMW,//宝马
};
设计一个委托,并且在interface 中遵守这个代理:
1
2
3
4
5
@protocol LYCarDelegate <NSObject>
//这个委托 说明了 哪种品牌的车 正在狂奔中...
- (void)running:(Class)cls;
@end
同时在定义这三个品牌的子类(他们的爸爸都是LYCarFactory):
子类会自动继承爸爸的属性、方法及委托协议!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 法拉利
*/
@interface LYFerrari : LYCarFactory
@end
/**
* 兰博基尼
*/
@interface LYLamborghini : LYCarFactory
@end
/**
* 宝马
*/
@interface LYBMW : LYCarFactory
@end
.m 中:
实现父类的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//根据品牌枚举 生产不同的车
+ (LYCarFactory *)carWithBrand:(LYCarBrand)brand{
switch (brand) {
case LYCarBrandFerrari:
return [[LYFerrari alloc]init];
break;
case LYCarBrandLamborghini:
return [[LYLamborghini alloc]init];
break;
case LYCarBrandBMW:
return [[LYBMW alloc]init];
break;
default:
break;
}
}
实现父类run函数,并且在此函数中,让代理执行代理方法!
1
2
3
4
5
6
7
8
- (void)run{
NSLog(@"%@ 狂奔中...\n",self.brandName);
NSLog(@"%.2f 大洋,好便宜啊!!!",self.price);
[_delegate running:[self class]];//执行代理方法
}
实现子类方法,因为不同品牌的车有不同的价格和名字:
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
/**
* 法拉利
*/
@implementation LYFerrari
- (double)price{
return 10;
}
- (NSString *)brandName{
return @"法拉利";
}
@end
/**
* 兰博基尼
*/
@implementation LYLamborghini
- (double)price{
return 20;
}
- (NSString *)brandName{
return @"兰博基尼";
}
@end
/**
* 宝马
*/
@implementation LYBMW
- (double)price{
return 30;
}
- (NSString *)brandName{
return @"宝马";
}
@end
OK,工厂模式设计好了!让它为我们生产一辆法拉利如何?
使用它:
首先创建这个汽车工厂对象:
1
2
3
LYCarFactory * carf = [LYCarFactory carWithBrand:LYCarBrandFerrari];
carf.delegate = self;//别忘了在interface遵守此代理哦
[carf run];//让车跑
实现代理方法,其中我们打印看看这辆车的类型:
1
2
3
- (void)running:(Class)cls{
NSLog(@"类型: %@",NSStringFromClass(cls));
}
运行它,打印结果如下:
2016-07-13 15:12:10.166 Test1[8578:238409] 法拉利 狂奔中…
2016-07-13 15:12:10.166 Test1[8578:238409] 10.00 大洋,好便宜啊!!!
2016-07-13 15:12:10.166 Test1[8578:238409] 类型: LYFerrari
我们可以看到,虽然我们外界没有运用LYFerrari 这个子类,但是通过品牌枚举,这个汽车工程依然把法拉利生产出来了!
没错,法拉利,10块大洋,好便宜啊!
Demo Github: