美文网首页
iOS设计模式——工厂方法的使用

iOS设计模式——工厂方法的使用

作者: iOS代码搬运工 | 来源:发表于2019-04-15 14:39 被阅读0次

引言

几乎在每个用面向对象语言写的应用程序里都能看到工厂方法。工厂方法模式是抽象工厂模式的组成部分。各种具体工厂重载其抽象工厂父类中定义的工厂方法,并用这个重载的工行方法创建自己的产品(对象)。
对象工厂与生产有形产品的真实工厂类似。例如,制鞋厂生产鞋,手机工厂生产手机。比方说,你让工厂给你生产些产品,你给他们发送一个“生产产品”的消息。制鞋厂和手机工厂都按照相同的“生产产品”的协议,启动其生产线。过程结束后,每个厂家都返回所生产的特定类型的产品。我们把“生产”这个有魔力的词称作工厂方法。因为它是命令生产者(工厂)得到想要的产品的方法。

1、何为工厂方法模式

  工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。
关系图.png
抽象的TKiPhoneObject定义了工厂方法创建的对象的接口。TKiPhoneXSObjectTKiPhoneXSMaxObjectTKiPhoneXRObject实现了TKiPhoneObject的接口。TKiPhoneFactory基类定义了返回TKiPhoneObject对象的工厂方法。它可以为工厂方法定义一个默认实现,返回默认的TKiPhoneObject对象。TKiPhoneFactory的其他操作可以调用此工厂方法创建TKiPhoneObject对象。TKiPhoneXSFactoryTKiPhoneXSMaxFactoryTKiPhoneXRFactoryTKiPhoneFactory的子类,它重载了工厂方法,以返回各自的实例。

2、何时使用工厂方法

在一下情形,你自然会想到使用工厂方法模式:

  • 编译时无法准确预期要创建的对象的类;
  • 类想让其子类决定在运行时创建什么;
  • 类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部化。

3、实例演示

举个栗子,苹果要生产三款新的iPhone手机 iPhone XS、iPhone XS Max、iPhone XR。那么首先需要创建三个工厂,这三个工厂的设备可以从一个基础工厂里面搬过来,而生产三款手机产品所需的配件则可从iPhone的原有配件(基类)中拿过来使用。那么先创建一个生产iPhone的基础工厂TKiPhoneFactory,然后再在这个基础上派生出TKiPhoneXSFactoryTKiPhoneXSMaxFactoryTKiPhoneXRFactory三个具体工厂。而具体的产品由基类TKiPhoneObject派生出 TKiPhoneXSObjectTKiPhoneXSMaxObjectTKiPhoneXRObject。定义这一系列的接口可以使用抽象类和协议。

  • TKiPhoneFactory
//TKiPhoneFactory.h
@class TKiPhoneObject;
@interface TKiPhoneFactory : NSObject
+ (TKiPhoneObject *)createiPhone;
@end

#import "TKiPhoneFactory.h"
#import "TKiPhoneObject.h"

//TKiPhoneFactory.m
@implementation TKiPhoneFactory
+ (TKiPhoneObject *)createiPhone {
    return [[TKiPhoneObject alloc] init];
}
@end
  • TKiPhoneXSFactory
//TKiPhoneXSFactory.h
#import "TKiPhoneFactory.h"

@interface TKiPhoneXSFactory : TKiPhoneFactory

@end
//TKiPhoneXSFactory.m
#import "TKiPhoneXSFactory.h"
#import "TKiPhoneXSObject.h"
@implementation TKiPhoneXSFactory
+ (TKiPhoneObject *)createiPhone {
    return [[TKiPhoneXSObject alloc] init];
}
@end
  • TKiPhoneXSMaxFactory
//TKiPhoneXSMaxFactory.h
#import "TKiPhoneFactory.h"

@interface TKiPhoneXSMaxFactory : TKiPhoneFactory

@end

TKiPhoneXSMaxFactory.m
#import "TKiPhoneXSMaxFactory.h"
#import "TKiPhoneXSMaxObject.h"
@implementation TKiPhoneXSMaxFactory
+ (TKiPhoneObject *)createiPhone {
    return [[TKiPhoneXSMaxObject alloc] init];
}
@end
  • TKiPhoneXRFactory
//TKiPhoneXRFactory.h
#import "TKiPhoneFactory.h"

@interface TKiPhoneXRFactory : TKiPhoneFactory

@end
//TKiPhoneXRFactory.m
#import "TKiPhoneXRFactory.h"
#import "TKiPhoneXRObject.h"
@implementation TKiPhoneXRFactory
+ (TKiPhoneObject *)createiPhone {
    return [[TKiPhoneXRObject alloc] init];
}
@end
  • TKiPhoneObject
//TKiPhoneObject.h
#import <Foundation/Foundation.h>

@interface TKiPhoneObject : NSObject
@property (nonatomic, copy) NSString *mobileName;
@end

//TKiPhoneObject.m
#import "TKiPhoneObject.h"

@implementation TKiPhoneObject
-(instancetype)init {
    self = [super init];
    if (self) {
        self.mobileName = @"iPhone手机";
    }
    return self;
}

@end
  • TKiPhoneXSObject
//TKiPhoneXSObject.h
#import "TKiPhoneObject.h"

@interface TKiPhoneXSObject : TKiPhoneObject

@end
//TKiPhoneXSObject.m
#import "TKiPhoneXSObject.h"

@implementation TKiPhoneXSObject
-(instancetype)init {
    self = [super init];
    if (self) {
        self.mobileName = @"iPhone XS";
    }
    return self;
}
@end
  • TKiPhoneXSMaxObject
//TKiPhoneXSMaxObject.h
#import "TKiPhoneObject.h"

@interface TKiPhoneXSMaxObject : TKiPhoneObject

@end
//TKiPhoneXSMaxObject.m
#import "TKiPhoneXSMaxObject.h"

@implementation TKiPhoneXSMaxObject
-(instancetype)init {
    self = [super init];
    if (self) {
        self.mobileName = @"iPhone XS Max";
    }
    return self;
}
@end
  • TKiPhoneXRObject
//TKiPhoneXRObject.h
#import "TKiPhoneObject.h"

@interface TKiPhoneXRObject : TKiPhoneObject

@end

//TKiPhoneXRObject.m
#import "TKiPhoneXRObject.h"

@implementation TKiPhoneXRObject
-(instancetype)init {
    self = [super init];
    if (self) {
        self.mobileName = @"iPhone XR";
    }
    return self;
}

@end

参考资料
《Object-C编程之道 iOS设计模式解析》
iOS 三种工厂模式(简单工厂模式、工厂模式、抽象工厂模式)

代码已上传Github,如有问题,欢迎指正。

相关文章

网友评论

      本文标题:iOS设计模式——工厂方法的使用

      本文链接:https://www.haomeiwen.com/subject/bxmqwqtx.html