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

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

简单工厂.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 一、工厂模式简介 意图定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进...
    怡红快绿阅读 592评论 0 0
  • 设计模式——工厂模式 工厂模式核心是封装对象的创建接口,将new对象的操作封装起来,方便创建使用、管理对象。 工厂...
    Ant_way阅读 524评论 0 0
  • 工厂模式和抽象工厂模式都属于创建型模式。 创建型模式这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不...
    TokyoZ阅读 261评论 0 0
  • 前言 最近在复习java设计模式中的工厂模式。本来有一点小小的理解。感觉都写的不错,就是有点太零散了,最后还是决定...
    斌林诚上阅读 18,712评论 3 25
  • 在周紫芝所著的《竹坡诗话》中有这么一段: 东坡性喜嗜猪,在黄州任内时,尝戏作《食猪肉诗》:「黄州好猪肉,价贱如粪土...
    Nesier无恙阅读 2,875评论 5 51