简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
定义解释的文字很单调, 下面举例说明
比如一个手机工厂, 它能生产iPhone, Android, Nokia三种手机.
这家工厂的营运模式为厂家直销, 就是直接卖给用户. 用户如果要买手机就直接给工厂下订单要什么手机, 工厂就直接按照客户要的型号生产一部手机出来给客户
这样我们就有3个因素: 工厂, 手机型号, 用户
下面我们构建代码
构建手机型号, 先定义一个基本手机模型 定义手机基本的功能, 打电话 发短信
我们通过协议的方式来定义
PhoneProtocol.h
#import <Foundation/Foundation.h>
@protocol PhoneProtocol <NSObject>
@required
/**
打电话
*/
- (void)makePhoneCall;
/**
发短信
*/
- (void)sendMessage;
@end
下面开始创建手机模型
BaseDevice.h 手机基类
#import <Foundation/Foundation.h>
#import "PhoneProtocol.h"
@interface BaseDevice : NSObject <PhoneProtocol>
@end
BaseDevice.m
#import "BaseDevice.h"
@implementation BaseDevice
- (void)makePhoneCall {
}
- (void)sendMessage {
}
@end
iPhone模型
iPhonebaseDevice.h (假如iPhone有一个特别的功能, 指纹识别)
#import "BaseDevice.h"
@interface iPhoneBaseDevice : BaseDevice
- (void)fingerIdentifier;
@end
iPhoneBaseDevice.m
#import "iPhoneBaseDevice.h"
@implementation iPhoneBaseDevice
- (void)makePhoneCall {
NSLog(@"iPhone makePhoneCall");
}
- (void)sendMessage {
NSLog(@"iPhone sendMessage");
}
- (void)fingerIdentifier {
NSLog(@"iPhone fingerIdentifier");
}
@end
Android手机
AndroidBaseDevice.h (假如Android手机有个特殊功能刷系统)
#import "BaseDevice.h"
@interface AndroidBaseDevice : BaseDevice
- (void)flashOS;
@end
AndroidBaseDevice.m
#import "AndroidBaseDevice.h"
@implementation AndroidBaseDevice
- (void)makePhoneCall {
NSLog(@"Android makePhoneCall");
}
- (void)sendMessage {
NSLog(@"Android sendMessage");
}
- (void)flashOS {
NSLog(@"Android flashOS");
}
@end
Nokia手机
NokiaBaseDevice.h (假如Nokia手机一个特殊功能砸核桃)
#import "BaseDevice.h"
@interface NokiaBaseDevice : BaseDevice
- (void)knockNut;
@end
NokiaBaseDevice.m
#import "NokiaBaseDevice.h"
@implementation NokiaBaseDevice
- (void)makePhoneCall {
NSLog(@"Nokia makePhoneCall");
}
- (void)sendMessage {
NSLog(@"Nokia sendMessage");
}
- (void)knockNut {
NSLog(@"Nokia knockNut");
}
@end
手机模型创建完了, 接着我们开始创建生产手机的工厂, 它有一个生产手机的方法
DeviceFactory.h
#import <Foundation/Foundation.h>
#import "iPhoneBaseDevice.h"
#import "NokiaBaseDevice.h"
#import "AndroidBaseDevice.h"
typedef enum : NSUInteger {
kiPhone = 0x11,
kAndroid,
kNokia,
} EPhoneDevice;
@interface DeviceFactory : NSObject
/**
制造手机方法
@param type 手机类型
@return 手机实例
*/
+ (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type;
@end
DeviceFactory.m
#import "DeviceFactory.h"
@implementation DeviceFactory
+ (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type {
BaseDevice *device = nil;
if (type == kiPhone) {
device = [[iPhoneBaseDevice alloc] init];
} else if (type == kNokia) {
device = [[NokiaBaseDevice alloc] init];
} else if (type == kAndroid) {
device = [[AndroidBaseDevice alloc] init];
}
return device;
}
@end
好了, 现在是用户就是我们 也就是Controller可以开始定做手机了
#import "ViewController.h"
#import "DeviceFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//创建一个iPhone手机实例
iPhoneBaseDevice *phone = [DeviceFactory createPhoneWithDeviceType: kiPhone];
//打电话
[phone makePhoneCall];
//发短信
[phone sendMessage];
//指纹识别
[phone fingerIdentifier];
}
@end
总结: 简单工厂方法就是定义创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使得一个类的实例化延迟到其子类
何时使用工厂方法呢?
1 编译时无法准确预期要创建的对象的类
2 类想让其子类决定在运行时创建什么
3 若有若干个辅助类为其子类, 而你想将返回哪个子类这一信息局部化
使用这一模式的最低限度是, 工厂方法能给予类在变更返回哪一种对象这一点上更多的灵活性
最后说明, 简单工厂模式可以比较清晰便捷的实现同一模型对象的创建
但有一个弊端就是, 只能定制创建已经写好的对象, 比如上面这个工厂只能生成iPhone/Android/Nokia这三种手机,
如果你想再定制华为手机或者小米手机, 那就要工厂去建华为和小米的手机生产线, 所以这种情况我们就要增加模型对象并修改工厂方法了