工厂模式
一、角色
1、抽象工厂
提供在系统中创建具体产品(实例)的具体工厂统一实现的接口
2、具体工厂
受客户端调用来创建具体产品(实例),与具体产品进行绑定
3、抽象产品
具体产品的父类,提供具体产品(实例)需要的属性和方法
4、具体产品
实现抽象产品的方法,每个具体工厂所创建的就是对应的具体产品的实例
二、优缺点
1、优点
符合面向对象设计的单一职责原则,有利于程序的拓展
抽象类、具体类之间的层次关系,降低了类的内聚
2、缺点
每增加一个产品时,就需要增加一个具体工厂类和具体产品类,这使得系统中的类的数量成倍增多。在一定程度上系统的复杂度也相应增加。
三、运用场景
1、数据存储(数据库、数据序列化、NSUserDefaults)
2、多种登录方式(密码登录、手势登录、指纹识别、人脸识别)
四、示意图
五、代码实例
============================== 抽象工厂.h文件 ==============================
#import <Foundation/Foundation.h>
// 抽象产品类
#import "LogInAbstractProduct.h"
@interface LogInAbstractFactory : NSObject
// 定义创建具体产品的接口
+ (LogInAbstractProduct *)creatLoginWay;
@end
============================== 具体工厂.h文件 ==============================
// 继承自抽象工厂类
@interface LogInFactoryOne : LogInAbstractFactory
@end
@interface LogInFactoryTwo : LogInAbstractFactory
@end
============================== 具体工厂.m文件 ==============================
#import "LogInFactoryOne.h"
#import "LogInWayOne.h"
@implementation LogInFactoryOne
// 实现创建与工厂相对应的产品实例
+ (LogInAbstractProduct *)creatLoginWay{
return [[LogInWayOne alloc] init];
}
@end
#import "LogInFactoryTwo.h"
#import "LogInWayTwo.h"
@implementation LogInFactoryTwo
// 实现创建与工厂相对应的产品实例
+ (LogInAbstractProduct *)creatLoginWay{
return [[LogInWayTwo alloc] init];
}
@end
============================== 抽象产品.h文件 ==============================
@interface LogInAbstractProduct : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *password;
- (void)requestLogin;
@end
============================== 具体产品.h文件 ==============================
// 产品一
@interface LogInWayOne : LogInAbstractProduct
@end
// 产品二
@interface LogInWayTwo : LogInAbstractProduct
@end
============================== 具体产品.m文件 ==============================
// 登录方式一的具体实现
@implementation LogInWayOne
- (void)requestLogin{
}
@end
// 登录方式二的具体实现
@implementation LogInWayTwo
- (void)requestLogin{
}
@end
============================== 客户端调用 ==============================
// 具体工厂与具体产品一一对应
LogInAbstractProduct *loginOne = [LogInFactoryOne creatLoginWay];
[loginOne requestLogin];
LogInAbstractProduct *loginTwo = [LogInFactoryTwo creatLoginWay];
[loginTwo requestLogin];