抽象工厂模式

抽象工厂模式

一、角色

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];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值