设计模式--工厂模式(简单工厂)

1. 工厂模式 (简单工厂)

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式

2. 工厂模式的优点:

1.简化生产流程
2.隔离生产细节
3.不同工厂生产产品 ,可以封装共有功能,实现独有功能
4.简单工厂模式中 ,工厂是一个实体的类(和抽象工厂对比)

3. 实例说明(制造手机与使用手机)

我们要使用手机, 那么我们作为客户端,向工厂提供我们的需求,然后工厂根据需求生成指定的手机
一个工厂 即可以生产诺基亚手机,也可以生产苹果手机,安卓手机等等,我们只需提出我们需要的手机,不用关心具体的生成过程

角色分析::::

客户类 责任:
1.不需要参加手机的制造
2.指定需要使用的产品(提出需求)

客户需求:::

// 产品的共有需求 使用协议 (手机的功能: 发短信 打电话)
@protocol FunctionManagementProtocol 
// 发短信
- (void)sendMessage;
// 打电话
- (void)phoneCall;
@end


产品(这里代表手机)遵守协议 ,实现共有的需求 ::

#import "FunctionManagementProtocol.h"

@interface BaseDevice : NSObject 
@end

方法实现:这里实现为空 就可以,具体的实现在每个工厂生产具体产品的时候复写
@implementation BaseDevice
#pragma FunctionManagementProtocol
- (void)phoneCall {}

- (void)sendMessage {  }
@end

工厂类 责任:
1.制造产品
2.封装制造细节

工厂管理器:指定工厂生产产品

#import 
//引入 产品类 和 具体工厂
#import "BaseDevice.h"
#import "iPhoneFactory.h"
#import "AndriodFactory.h"

// 枚举值: 表示可生产的产品
typedef enum : NSUInteger {
    kiPhone,
    kAndriod,
} EDeviceType;

@interface DeviceFactory : NSObject
/**
 便利构造器
 @param type 需要提供产品的类型
 @return 客户需要的产品
 */
+ (BaseDevice  *) deviceFactoryWithDevieType:(EDeviceType)type;
@end

// 根据枚举参数 生产不同的产品
@implementation DeviceFactory

+ (BaseDevice  *)deviceFactoryWithDevieType:(EDeviceType)type {
    
    BaseDevice  *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

简单工厂.png

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

你可能感兴趣的:(设计模式--工厂模式(简单工厂))