相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的
抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产
比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买Android手机就创建一个Goolge工厂
这样创建工厂, 工厂, 用户这样就是我们要考虑的因素 (其实还有手机, 这里就跳过不讲了跟简单工厂模式里面一样)
创建工厂要有一个管理对象, 来根据客户的需求自动创建相应的工厂
工厂只要负责生产手机就好了
现在来构建代码
先写一个基本工厂模型
BaseFactory.h
代码语言:javascript复制 1 #import <Foundation/Foundation.h>
2
3 @interface BaseFactory : NSObject
4
5 /**
6 创建手机方法
7
8 @return 返回手机对象
9 */
10 - (id)createPhone;
11
12 @end
BaseFactory.m
代码语言:javascript复制 1 #import "BaseFactory.h"
2
3 @implementation BaseFactory
4
5 - (id)createPhone {
6
7 //可以再添加代码禁止BaseFactory直接调用此方法
8 //只允许子类调用
9 return nil;
10 }
11
12 @end
来创建Apple工厂
AppleFactory.h
代码语言:javascript复制1 #import "BaseFactory.h"
2
3 @interface AppleFactory : BaseFactory
4
5 @end
AppleFactory.m
代码语言:javascript复制 1 #import "AppleFactory.h"
2
3 @implementation AppleFactory
4
5 - (id)createPhone {
6
7 NSLog(@"创建Apple手机");
8 //这里应该是再给给工程添加手机模型, 创建并返回手机对象
9 //现在只是举例 先不实现这部分
10 return nil;
11 }
12
13 @end
创建Google工厂
GoogleFactory.h
代码语言:javascript复制1 #import "BaseFactory.h"
2
3 @interface GoogleFactory : BaseFactory
4
5 @end
GoogleFactory.m
代码语言:javascript复制 1 #import "GoogleFactory.h"
2
3 @implementation GoogleFactory
4
5 - (id)createPhone {
6
7 NSLog(@"创建Google手机");
8 //这里应该是再给给工程添加手机模型, 创建并返回手机对象
9 //现在只是举例 先不实现这部分
10 return nil;
11 }
12
13 @end
下面是工厂管理者
FactoryManager.h负责根据用户需求创建工厂去生产
代码语言:javascript复制 1 #import <Foundation/Foundation.h>
2 #import "AppleFactory.h"
3 #import "GoogleFactory.h"
4
5 typedef enum : NSUInteger {
6 kApple = 0x1,
7 kGoogle,
8 } EFactoryType;
9
10 @interface FactoryManager : NSObject
11
12 /**
13 创建手机工厂
14
15 @param type 工厂类别
16 @return 返回工厂对象
17 */
18 (id)createFactoryWithType:(EFactoryType)type;
19
20 @end
FactoryManager.m
代码语言:javascript复制 1 #import "FactoryManager.h"
2
3 @implementation FactoryManager
4
5 (id)createFactoryWithType:(EFactoryType)type {
6
7 BaseFactory *factory;
8 if (type == kApple) {
9
10 factory = [[AppleFactory alloc] init];
11
12 } else if (type == kGoogle) {
13
14 factory = [[GoogleFactory alloc] init];
15
16 }
17
18 return factory;
19 }
20
21 @end
下面是实现
代码语言:javascript复制 1 #import "ViewController.h"
2 #import "FactoryManager.h"
3
4 @interface ViewController ()
5
6 @end
7
8 @implementation ViewController
9
10 - (void)viewDidLoad {
11
12 [super viewDidLoad];
13
14 //创建工厂
15 AppleFactory *factory = [FactoryManager createFactoryWithType:kApple];
16
17 //工厂生产手机
18 [factory createPhone];
19
20 }
21
22
23
24 @end
抽象工厂模式比简单工厂模式更加灵活