Home 工厂模式
Post
Cancel

工厂模式

工厂模式: 简而言之,假如有这样一个汽车工厂,不管你需要那种品牌的车,都可以为你生产出来。

好处是啥?

    因为这样做太酷了!

实现这个工厂!

首先,定义一个汽车工厂类,取名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:

 https://github.com/ly918/Demos

This post is licensed under CC BY 4.0 by the author.

响应式编程

链式编程