简单工厂模式、工厂方法模式、抽象工程模式 【OC】

本文介绍了Objective-C中如何实现简单工厂模式、工厂方法模式和抽象工厂模式。由于OC没有抽象类,作者通过协议实现了类似的功能。简单工厂模式用于根据条件创建不同对象,但可能导致所有实例创建过于集中。工厂方法模式通过让核心工厂类的子类负责具体产品创建,降低了耦合度。抽象工厂模式在有多个相关产品系列时发挥作用,提供创建一系列相关对象的接口,无需指定具体类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在介绍工厂模式之前,先说一下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;
}
  • 简单工厂

直接用代码示意

我们去买衣服 ,有毛衣 和 卫衣两种

  1. 创建一个协议 YiFuProtocol
    @protocol YiFuProtocol <NSObject>
    - (NSString *)name;
    @end
  2. 创建 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

     

  3. 创建工厂类
    @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

     

  4. 调用
        id<YiFuProtocol> obj = [YiFuFactory yifuWithType:@"毛衣"];
    

     

  • 工厂方法模式

  1. 创建工厂抽象类
    @protocol YiFuMakeProtocol <NSObject>
    - (id<YiFuProtocol>)createYiFu;
    @end

     

  2. 创建工厂实体
    // 毛衣的工厂类
    @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

     

  3. 产品抽象类 还是之前的 毛衣和卫衣也是之前的
    @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
  4. 客户端调用
        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];

 

  • 总结

  1. 简单工厂
    优势:可以根据不同条件创建不同的对象,区分了责任和权限,可以优化项目结构
    劣势:所有实例创建都聚集在了一起
  2. 工厂方法
    核心工厂类不再负责具体产品创建,将工作分发给子类,自己只提供子类必须实现的接口。
    在本例中是用的protocol ,更好的方式应该是抽象类,可以提供默认实现,子类需要的话重写就可以。
    用户在使用产品的时候只需要关心接口提供的方法即可。
  3. 抽象工厂
    该模式是指有多个抽象角色时所使用的工厂模式。定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值