抽象工厂模式
一、角色
1、抽象工厂
定义并实现选择不同工厂的方法
定义根据不同的条件生成不同的具体产品的方法
2、具体工厂
继承自抽象工厂,实现生成不同的具体产品的逻辑判断(一个具体工厂对应一个产品族)
3、抽象产品
定义具体产品所需的属性和方法
4、具体产品
继承自抽象产品,完成产品的具体实现
二、优缺点
1、优点
将一系列相关或者相互依赖的产品族放到一起去创建,分离调用和创建逻辑
易于改变产品的系列(例如:QQ的皮肤切换)
2、缺点
当要增加新的产品种类时,需要修改抽象工厂的接口(困难度,复杂度都很大)
代码结构相对比较复杂
三、运用场景
切换产品系列
四、示意图
五、代码实例
============================== 抽象工厂.h文件 ==============================
// 抽象产品类(产品的父类)
#import "LogInAbstractProductOne.h"
#import "LogInAbstractProductTwo.h"
typedef NS_ENUM(NSInteger, LogInFactoryType) {
loginFactory_one,
loginFactory_two
};
typedef NS_ENUM(NSInteger, LogInAbstractOneProductType) {
LogInAbstractOneProduct_One,
LogInAbstractOneProduct_Two
};
typedef NS_ENUM(NSInteger, LogInAbstractTwoProductType) {
LogInAbstractTwoProduct_One,
LogInAbstractTwoProduct_Two
};
@interface LogInAbstractFactory : NSObject
/// 根据传入的条件,返回不同的登录方式
+ (LogInAbstractFactory *)factoryWithType:(LogInFactoryType)type;
// 产品族一
- (LogInAbstractProductOne *)factoryOneCreatProductWithType:(LogInAbstractOneProductType)type;
// 产品族二
- (LogInAbstractProductTwo *)factoryTwoCreatProductWithType:(LogInAbstractTwoProductType)type;
@end
============================== 抽象工厂.m文件 ==============================
#import "LogInFactoryOne.h"
#import "LogInFactoryTwo.h"
@implementation LogInAbstractFactory
/// 根据传入的条件,返回不同的登录模式
+ (LogInAbstractFactory *)factoryWithType:(LogInFactoryType)type{
LogInAbstractFactory *factory;
switch (type) {
case loginFactory_one:
factory = [[LogInFactoryOne alloc] init];
break;
case loginFactory_two:
factory = [[LogInFactoryTwo alloc] init];
break;
default:
break;
}
return factory;
}
@end
============================== 具体工厂.h文件 ==============================
// 登录模式一
@interface LogInFactoryOne : LogInAbstractFactory
@end
// 登录模式二
@interface LogInFactoryTwo : LogInAbstractFactory
@end
============================== 具体工厂.m文件 ==============================
// 登录模式一
#import "LogInFactoryOne.h"
#import "LoginProductOne.h"
#import "LoginProductTwo.h"
@implementation LogInFactoryOne
- (LogInAbstractProductOne *)factoryOneCreatProductWithType:(LogInAbstractOneProductType)type{
LogInAbstractProductOne *product;
switch (type) {
case LogInAbstractOneProduct_One:
product = [[LoginProductOne alloc] init];
break;
case LogInAbstractOneProduct_Two:
product = [[LoginProductTwo alloc] init];
break;
default:
break;
}
return product;
}
@end
// 登录模式二
#import "LogInFactoryTwo.h"
#import "LoginProductThree.h"
#import "LoginProductFour.h"
@implementation LogInFactoryTwo
- (LogInAbstractProductTwo *)factoryTwoCreatProductWithType:(LogInAbstractTwoProductType)type{
LogInAbstractProductTwo *product;
switch (type) {
case LogInAbstractTwoProduct_One:
product = [[LoginProductThree alloc] init];
break;
case LogInAbstractTwoProduct_Two:
product = [[LoginProductFour alloc] init];
break;
default:
break;
}
return product;
}
@end
============================== 抽象产品.h文件 ==============================
// 产品族一
@interface LogInAbstractProductOne : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *password;
- (void)requestLoginOne;
@end
// 产品族二
@interface LogInAbstractProductTwo : NSObject
@property (nonatomic, strong) NSString *phoneNumber;
@property (nonatomic, strong) NSString *password;
- (void)requestLoginTwo;
@end
============================== 具体产品.h文件 ==============================
// 产品族一的产品
@interface LoginProductOne : LogInAbstractProductOne
@end
// 产品族一的产品
@interface LoginProductTwo : LogInAbstractProductOne
@end
// 产品族二的产品
@interface LoginProductThree : LogInAbstractProductTwo
@end
// 产品族二的产品
@interface LoginProductFour : LogInAbstractProductTwo
@end
============================== 具体产品.m文件 ==============================
// 产品族一的产品实现
@implementation LoginProductOne
- (void)requestLoginOne{
}
@end
// 产品族二的产品实现
@implementation LoginProductThree
- (void)requestLoginTwo{
}
@end
============================== 调用示例 ==============================
LogInAbstractFactory *factory1 = [LogInAbstractFactory factoryWithType:loginFactory_one];
LogInAbstractProductOne *loginOne = [factory1 factoryOneCreatProductWithType:LogInAbstractOneProduct_One];
[loginOne requestLoginOne];
LogInAbstractFactory *factory2 = [LogInAbstractFactory factoryWithType:loginFactory_two];
LogInAbstractProductTwo *loginTwo = [factory2 factoryTwoCreatProductWithType:LogInAbstractTwoProduct_One];
[loginTwo requestLoginTwo];