Objective-C 工厂模式(下) -- 抽象工厂模式

相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的
抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产
比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买Android手机就创建一个Goolge工厂

这样创建工厂, 工厂, 用户这样就是我们要考虑的因素 (其实还有手机, 这里就跳过不讲了跟简单工厂模式里面一样)
创建工厂要有一个管理对象, 来根据客户的需求自动创建相应的工厂
工厂只要负责生产手机就好了

现在来构建代码
先写一个基本工厂模型
BaseFactory.h

#import 

@interface BaseFactory : NSObject

/**
 创建手机方法

 @return 返回手机对象
 */
- (id)createPhone;

@end

BaseFactory.m

#import "BaseFactory.h"

@implementation BaseFactory

- (id)createPhone {
    
    //可以再添加代码禁止BaseFactory直接调用此方法
    //只允许子类调用
    return nil;
}

@end

来创建Apple工厂

AppleFactory.h

#import "BaseFactory.h"

@interface AppleFactory : BaseFactory 

@end

AppleFactory.m

#import "AppleFactory.h"

@implementation AppleFactory

- (id)createPhone {
    
    NSLog(@"创建Apple手机");
    //这里应该是再给给工程添加手机模型, 创建并返回手机对象
    //现在只是举例 先不实现这部分
    return nil;
}

@end

创建Google工厂
GoogleFactory.h

#import "BaseFactory.h"

@interface GoogleFactory : BaseFactory

@end

GoogleFactory.m

#import "GoogleFactory.h"

@implementation GoogleFactory

- (id)createPhone {
    
    NSLog(@"创建Google手机");
    //这里应该是再给给工程添加手机模型, 创建并返回手机对象
    //现在只是举例 先不实现这部分
    return nil;
}

@end

下面是工厂管理者
FactoryManager.h负责根据用户需求创建工厂去生产

#import 
#import "AppleFactory.h"
#import "GoogleFactory.h"

typedef enum : NSUInteger {
    kApple = 0x1,
    kGoogle,
} EFactoryType;

@interface FactoryManager : NSObject

/**
 创建手机工厂

 @param type 工厂类别
 @return 返回工厂对象
 */
+ (id)createFactoryWithType:(EFactoryType)type;

@end

FactoryManager.m

#import "FactoryManager.h"

@implementation FactoryManager

+ (id)createFactoryWithType:(EFactoryType)type {
    
    BaseFactory *factory;
    if (type == kApple) {
        
        factory = [[AppleFactory alloc] init];
        
    } else if (type == kGoogle) {
        
        factory = [[GoogleFactory alloc] init];
        
    }
    
    return factory;
}

@end

下面是实现

#import "ViewController.h"
#import "FactoryManager.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //创建工厂
    AppleFactory *factory = [FactoryManager createFactoryWithType:kApple];
    
    //工厂生产手机
    [factory createPhone];
    
}

@end

抽象工厂模式比简单工厂模式更加灵活

你可能感兴趣的:(Objective-C 工厂模式(下) -- 抽象工厂模式)