iOS工厂模式
简单工厂模式(Simple Factory)
定义:通过一个工厂类集中管理所有对象的创建,客户端通过传入参数指定所需产品类型。
工厂类通常包含一个静态方法(类方法),由该方法根据输入类型负责创建具体的产品(对象)。
简单的拿我项目之中内容来举例,我在地图之中标点有乡村景点和民俗之分,不同位置对应的标点显示图片不同,于是就分为不同的标点,于是我为BJAnnotation
写了一个类方法
typedef enum BJAnnotationType {
BJAnnotationTypeScenery = 0,
BJAnnotationTypeLiving = 1
} BJAnnotationType;
+(BJyAnnotation *)AnnotationWithType:(BJAnnotationType)type {
switch (type) {
case BJAnnotationTypeScenery:
BJSceneryAnnotation *annotation = [[BJSceneryAnnotation alloc] init];
return annotation;
case BJAnnotationTypeLiving:
BJLivingAnnotation *annotation = [[BJLivingAnnotation alloc] init];
return annotation;
default:
return nil;
}
}
其实说白了就是根据不同的情况生成了不同的类,我们可以获取所需要的对象,而不需要知道其创建细节,一定程度上减少系统的耦合
工厂方法模式(Factory Method)
定义:将对象的创建延迟到子类,每个具体工厂负责一个具体产品的实例化。
- 抽象工厂接口:声明创建产品的抽象方法(如
sellPhone
方法) - 具体工厂类:实现接口,返回特定产品实例(如
XiaomiFactory
创建小米手机) - 产品继承体系:与简单工厂模式类似,但工厂与产品一一对应
在OC之中,我们其实可以使用协议来实现一个工厂类的抽象方法,类似内容如下
@protocol PhoneMakeProtocol <NSObject>
+ (phone *)sellPhone; // 这个phone可以作为抽象类(小米,苹果手机都继承于他)
@end
建立一个具体的工厂类
@interface iPhoneFactory : NSObject <PhoneMakeProtocol>
@end
@implementation iPhoneFactory
- (phone *)sellPhone {
return [[iPhone alloc] init];
}
@end
抽象工厂模式(Abstract Factory)
定义:创建一组相关或依赖对象的家族(产品族),确保产品之间的兼容性。
工厂模式是创建型设计模式的核心类型之一,其核心目标是将对象的创建与使用解耦,提升系统的扩展性和可维护性。根据创建逻辑的抽象层级不同,工厂模式可分为以下三种类型:三、抽象工厂模式(Abstract Factory)
说白了,其实就是这个工厂能够实现更多的协议,我们在原先的工厂类之中添加一个协议方法,让其可以生产computer
, 我们可以在同个协议之中定义多个方法,也可以利用协议多继承的性质
//协议之中定义多个方法
@protocol PoductMakeProtocol <NSObject>
+ (phone *)sellPhone;
+ (computer *)sellComputer;
@end
//多继承
@protocol PhoneMakeProtocol <NSObject>
- (phone *)sellPhone;
@end
@protocol ComputerMakeProtocol <NSObject>
- (computer *)sellComputer;
@end
工厂实例
@interface iPhoneFactory : NSObject <PhoneMakeProtocol>
@end
@implementation iPhoneFactory
- (phone *)sellPhone {
return [[iPhone alloc] init];
}
- (computer *)sellComputer {
return [[Mac alloc] init];
}
@end
优点:
- 保证产品族内对象的一致性(如同一品牌的汽车部件)
- 支持横向扩展(新增产品族无需修改现有代码)
缺点:
- 扩展新产品类型需修改抽象工厂接口,灵活性较低
三种模式对比
维度 | 简单工厂 | 工厂方法 | 抽象工厂 |
---|---|---|---|
核心目标 | 集中创建单一产品 | 子类化扩展单一产品 | 创建关联产品族 |
扩展性 | 差(需修改工厂类) | 高(新增工厂类) | 中(新增产品族) |
适用场景 | 简单、固定类型 | 动态扩展单一产品类型 | 多维度关联产品 |
典型应用 | 工具类生成器 | 支付方式扩展 | 跨平台 UI 组件 |
演进逻辑:
- 简单工厂 → 工厂方法:从硬编码参数到多态扩展,解决开闭原则问题
- 工厂方法 → 抽象工厂:从单一产品到产品族的抽象,提升系统一致性
选择原则:
- 若产品类型单一且稳定,优先使用简单工厂;
- 若需灵活扩展独立产品,选择工厂方法;
- 若需管理多个关联产品,采用抽象工厂