简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 —— 百度百科

举例说明:
比如说,有一个汽车工厂,能生产Benz和BMW两种car。用简单工厂来实现:
- 首先,要有一个工厂:

#import <Foundation/Foundation.h>
#import "CQCar.h"
typedef NS_ENUM(NSUInteger, CQCarType) {
/** 奔驰 */
CQCarTypeBenz,
/** 宝马 */
CQCarTypeBMW
};
@interface CQCarFactory : NSObject
/**
根据type生产对应类型的car
@param type car的type
@return 具体的car实例
*/
+ (CQCar *)produceCarWithType:(CQCarType)type;
@end
- 工厂根据传入的type生产Benz和BMW两种car(都继承自car):

@implementation CQCarFactory
/**
根据type生产对应类型的car
@param type car的type
@return 具体的car实例
*/
+ (CQCar *)produceCarWithType:(CQCarType)type {
switch (type) {
case CQCarTypeBenz: // 奔驰
{
CQCarBenz *benz = [[CQCarBenz alloc] init];
return benz;
}
break;
case CQCarTypeBMW: // 宝马
{
CQCarBMW *bmw = [[CQCarBMW alloc] init];
return bmw;
}
break;
default: // 一般的(比如说奥拓🙃)
{
CQCar *car = [[CQCar alloc] init];
return car;
}
break;
}
}
@end
- 工厂的使用:
// 要生产的car的类型
NSArray *typeArray = @[@(CQCarTypeBenz), @(CQCarTypeBMW), @(CQCarTypeBenz)];
for (int i = 0; i < typeArray.count; i++) {
CQCarType carType = [typeArray[i] integerValue];
// 传入type,创建car
CQCar *car = [CQCarFactory produceCarWithType:carType];
// 打印car的信息
[car printInfo];
}

总结一下简单工厂:
封装一个工厂类(CarFactory),这个类可以根据传入的参数(CarType)创建出对应的实例(Benz和BMW),并且这些实例的父类相同(都属于car)。
简单工厂就是这么简单。
注:简单工厂不属于23种GOF设计模式之一。
demo
https://github.com/CaiWanFeng/iOS_Storage
此demo位置:

网友评论