工厂方法模式

工厂模式

一、角色

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值