在介绍工厂模式之前,先说一下OC并没有提供抽象类(abstract class),所以如果我们需要的话需要自己实现一下,其实就是把init重写,如果直接调用本类的init 返回nil。
- (instancetype)init
{
if ([self isMemberOfClass:YiFu.class]) { /** 这里一定要用 isMemberOfClass, 区分开isKindOfClass */
[self doesNotRecognizeSelector:_cmd];
return nil;
}
self = [super init];
if (self) {
}
return self;
}
-
简单工厂
直接用代码示意
我们去买衣服 ,有毛衣 和 卫衣两种
- 创建一个协议 YiFuProtocol
@protocol YiFuProtocol <NSObject> - (NSString *)name; @end
- 创建 MaoYi 和 WeiYi 类 遵守YiFuProtocol协议
@interface WeiYi : NSObject <YiFuProtocol> @end @implementation WeiYi - (NSString *)name { return @"WeiYi L"; } @end @interface MaoYi : NSObject <YiFuProtocol> @end @implementation MaoYi - (NSString *)name { return @"MaoYi L"; } @end
- 创建工厂类
@interface YiFuFactory : NSObject + (id<YiFuProtocol>)yifuWithType:(NSString *)type; @end @implementation YiFuFactory + (id<YiFuProtocol>)yifuWithType:(NSString *)type { if ([type isEqualToString:@"毛衣"]) { return [[MaoYi alloc] init]; }else if ([type isEqualToString:@"卫衣"]) { return [[WeiYi alloc] init]; } return nil; } @end
- 调用
id<YiFuProtocol> obj = [YiFuFactory yifuWithType:@"毛衣"];
-
工厂方法模式
- 创建工厂抽象类
@protocol YiFuMakeProtocol <NSObject> - (id<YiFuProtocol>)createYiFu; @end
- 创建工厂实体
// 毛衣的工厂类 @interface MaoYiFactory : NSObject <YiFuMakeProtocol> @end @implementation MaoYiFactory - (id<YiFuProtocol>)createYiFu { return [[MaoYi alloc] init]; } @end // 卫衣的工厂类 @interface WeiYiFactory : NSObject <YiFuMakeProtocol> @end @implementation WeiYiFactory - (id<YiFuProtocol>)createYiFu { return [[WeiYi alloc] init]; } @end
- 产品抽象类 还是之前的 毛衣和卫衣也是之前的
@interface WeiYi : NSObject <YiFuProtocol> @end @implementation WeiYi - (NSString *)name { return @"WeiYi L"; } @end @interface MaoYi : NSObject <YiFuProtocol> @end @implementation MaoYi - (NSString *)name { return @"MaoYi L"; } @end
- 客户端调用
id<YiFuMakeProtocol> factory = [[MaoYiFactory alloc] init]; id<YiFuProtocol> yifu = [factory createYiFu]; NSLog(@"size : %@",[yifu name] );
-
抽象工厂模式
现在客户要买 衣服 和 裤子
首先提供一个协议 创建衣服和裤子,现在有两个工厂 A厂 生产毛衣、毛裤, B厂 生产卫衣,卫裤。
之前已经有了衣服的协议,我们再来一个裤子的协议,为了不和衣服协议重复,假设为材料吧
@protocol KuZiMakeProtocol <NSObject> - (NSString *)cailiao; @end
创建两个产品类 毛裤 卫裤
@interface MaoKu : NSObject <KuZiProtocol> @end @implementation MaoKu - (NSString *)cailiao { return @"maoku C"; } @end @interface WeiKu : NSObject <KuZiProtocol> @end @implementation WeiKu - (NSString *)cailiao { return @"weiku C"; } @end
工厂抽象类
@protocol ShopProtocol <NSObject> - (id<YiFuProtocol>)createYiFu; - (id<KuZiProtocol>)createKuZi; @end
A、B工厂
@interface A : NSObject <ShopProtocol> @end @implementation A - (id<YiFuProtocol>)createYiFu { return [[MaoYi alloc] init]; } - (id<KuZiProtocol>)createKuZi { return [[MaoKu alloc] init]; } @end @interface B : NSObject <ShopProtocol> @end @implementation B - (id<KuZiProtocol>)createKuZi { return [[WeiKu alloc] init]; } - (id<YiFuProtocol>)createYiFu { return [[WeiYi alloc] init]; } @end
客户端调用
id<ShopProtocol> shop = [[A alloc] init]; id<YiFuProtocol> yifu = [shop createYiFu]; id<KuZiProtocol> kuzi = [shop createKuZi];
-
总结
- 简单工厂
优势:可以根据不同条件创建不同的对象,区分了责任和权限,可以优化项目结构
劣势:所有实例创建都聚集在了一起- 工厂方法
核心工厂类不再负责具体产品创建,将工作分发给子类,自己只提供子类必须实现的接口。
在本例中是用的protocol ,更好的方式应该是抽象类,可以提供默认实现,子类需要的话重写就可以。
用户在使用产品的时候只需要关心接口提供的方法即可。- 抽象工厂
该模式是指有多个抽象角色时所使用的工厂模式。定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。