1. 工厂模式 (简单工厂)
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式
2. 工厂模式的优点:
1.简化生产流程
2.隔离生产细节
3.不同工厂生产产品 ,可以封装共有功能,实现独有功能
4.简单工厂模式中 ,工厂是一个实体的类(和抽象工厂对比)
3. 实例说明(制造手机与使用手机)
我们要使用手机, 那么我们作为客户端,向工厂提供我们的需求,然后工厂根据需求生成指定的手机
一个工厂 即可以生产诺基亚手机,也可以生产苹果手机,安卓手机等等,我们只需提出我们需要的手机,不用关心具体的生成过程
角色分析::::
客户类 责任:
1.不需要参加手机的制造
2.指定需要使用的产品(提出需求)
客户需求:::
// 产品的共有需求 使用协议 (手机的功能: 发短信 打电话)
@protocol FunctionManagementProtocol <NSObject>
// 发短信
- (void)sendMessage;
// 打电话
- (void)phoneCall;
@end
产品(这里代表手机)遵守协议 ,实现共有的需求 ::
#import "FunctionManagementProtocol.h"
@interface BaseDevice : NSObject <FunctionManagementProtocol>
@end
方法实现:这里实现为空 就可以,具体的实现在每个工厂生产具体产品的时候复写
@implementation BaseDevice
#pragma FunctionManagementProtocol
- (void)phoneCall {}
- (void)sendMessage { }
@end
工厂类 责任:
1.制造产品
2.封装制造细节
工厂管理器:指定工厂生产产品
#import <Foundation/Foundation.h>
//引入 产品类 和 具体工厂
#import "BaseDevice.h"
#import "iPhoneFactory.h"
#import "AndriodFactory.h"
// 枚举值: 表示可生产的产品
typedef enum : NSUInteger {
kiPhone,
kAndriod,
} EDeviceType;
@interface DeviceFactory : NSObject
/**
便利构造器
@param type 需要提供产品的类型
@return 客户需要的产品
*/
+ (BaseDevice <FunctionManagementProtocol> *) deviceFactoryWithDevieType:(EDeviceType)type;
@end
// 根据枚举参数 生产不同的产品
@implementation DeviceFactory
+ (BaseDevice <FunctionManagementProtocol> *)deviceFactoryWithDevieType:(EDeviceType)type {
BaseDevice <FunctionManagementProtocol> *device = nil;
if (type == kiPhone ) {
device = [[iPhoneFactory alloc] init];
} else if (type == kAndriod) {
device = [[AndriodFactory alloc] init];
} else if (type == kNokia) {
device = [[NokiaFactory alloc] init];
}
return device;
}
具体工厂类
安卓工厂
#import "BaseDevice.h"
@interface AndriodFactory : BaseDevice
@end
//实现共有功能
#import "AndriodFactory.h"
@implementation AndriodFactory
- (void)phoneCall{
NSLog(@"Andriod phoneCall");
}
- (void)sendMessage{
NSLog(@"Andriod sendMessage");
}
@end
苹果工厂:增加一个独有功能 手势识别
#import "BaseDevice.h"
@interface iPhoneFactory : BaseDevice
/**
* 指纹识别
*/
- (void)fingerprintIndetification;
@end
#import "iPhoneFactory.h"
@implementation iPhoneFactory
- (void)phoneCall{
NSLog(@"iPhone phoneCall");
}
- (void)sendMessage{
NSLog(@"iPhone sendMessage");
}
- (void)fingerprintIndetification{
NSLog(@"iPhone fingerprintIndetification");
}
@end
实现了上面的功能 ,可以调用
//工厂模式 vc客户端 调用
// 多态 调用共有功能
BaseDevice *iphone_base = [DeviceFactory deviceFactoryWithDevieType:kiPhone];
[iphone_base phoneCall];
// 强转 调用独有功能
iPhoneFactory *iphone = (iPhoneFactory *)iphone_base;
[iphone fingerprintIndetification];
4. 简单工厂的UML
client:vc客户端 product:产品共有功能协议
simpleFactory损:工厂管理器
concreateProductA:苹果工厂
concreateProductB:安卓工厂
uml解析:
1.客户端client -- 简单工厂simpleFactory :关联关系
2.客户端client -- 产品product :关联关系
3.简单工厂simpleFactory -- 具体产品concreateProductA:依赖关系
4.简单工厂simpleFactory -- 具体产品concreateProductB:依赖关系
5.产品product -- 具体产品concreateProductA :实现关系
6.产品product -- 具体产品concreateProductB :实现关系
注释:
实现(realization)关系:
指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;
concreateProductA,concreateProductB 实现了product 协议接口
依赖(dependency)关系:
表示类与类之间的连接,表示一个类依赖于另外一个类的定义,依赖关系时是单向的。简单理解就是类A使用到了类B,这种依赖具有偶然性、临时性,是非常弱的关系。但是类B的变化会影响到类A。
类A:simpleFactory,类B:concreateProductA,concreateProductB
关联(association)关系:
表示类与类之间的连接,它使得一个类知道另外一个类的属性和方法。
关联可以使用单箭头表示单向关联,使用双箭头或者不适用箭头表示双向关联.
关联关系体现的是两个类,或者类与接口之间的强依赖关系,这种关系很强烈,比依赖更强,不是偶然性的,也不是临时性的,而是一种长期性,相对平等的关系.
表现在代码层面,为被关联的类B以类属性的形式出现在类A中,也可能是关联类A引用了被关联类B的全局变量。
类A:client ,类B:product,simpleFactory