相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的
抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产
比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买Android手机就创建一个Goolge工厂
这样创建工厂, 工厂, 用户这样就是我们要考虑的因素 (其实还有手机, 这里就跳过不讲了跟简单工厂模式里面一样)
创建工厂要有一个管理对象, 来根据客户的需求自动创建相应的工厂
工厂只要负责生产手机就好了
现在来构建代码
先写一个基本工厂模型
BaseFactory.h
#import <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>
#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
抽象工厂模式比简单工厂模式更加灵活