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

抽象的
TKiPhoneObject
定义了工厂方法创建的对象的接口。TKiPhoneXSObject
、TKiPhoneXSMaxObject
、TKiPhoneXRObject
实现了TKiPhoneObject
的接口。TKiPhoneFactory
基类定义了返回TKiPhoneObject
对象的工厂方法。它可以为工厂方法定义一个默认实现,返回默认的TKiPhoneObject
对象。TKiPhoneFactory
的其他操作可以调用此工厂方法创建TKiPhoneObject
对象。TKiPhoneXSFactory
、TKiPhoneXSMaxFactory
、TKiPhoneXRFactory
是TKiPhoneFactory
的子类,它重载了工厂方法,以返回各自的实例。
2、何时使用工厂方法
在一下情形,你自然会想到使用工厂方法模式:
- 编译时无法准确预期要创建的对象的类;
- 类想让其子类决定在运行时创建什么;
- 类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部化。
3、实例演示
举个栗子,苹果要生产三款新的iPhone手机 iPhone XS、iPhone XS Max、iPhone XR。那么首先需要创建三个工厂,这三个工厂的设备可以从一个基础工厂里面搬过来,而生产三款手机产品所需的配件则可从iPhone的原有配件(基类)中拿过来使用。那么先创建一个生产iPhone的基础工厂TKiPhoneFactory
,然后再在这个基础上派生出TKiPhoneXSFactory
、TKiPhoneXSMaxFactory
、TKiPhoneXRFactory
三个具体工厂。而具体的产品由基类TKiPhoneObject
派生出 TKiPhoneXSObject
、TKiPhoneXSMaxObject
、TKiPhoneXRObject
。定义这一系列的接口可以使用抽象类和协议。
- 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,如有问题,欢迎指正。
网友评论