一、简单工厂
首先工厂模式其实分为简单工厂,工厂方法和抽象工厂,工厂模式其实就是我需要什么,这个工厂就给我制造什么。
关于简单工厂模式的应用如下所示:
首先中定义一个抽象类,抽象类中写一些我们需要的抽象方法或者属性,抽象子类去继承这个抽象类,然后再去实现具体的操作。然后工厂类根据外界的需求去创建对应的抽象子类实例并传给外界,而对象的创建是什么类型是由外界决定的。外界只需要知道抽象子类与之对应的参数即可,而不需要知道抽象子类的创建过程。
简单工厂模式就是将对象的创建和要创建对象需要的业务逻辑分离,这样的话可以降低操作对象的耦合度。由于工厂类只是为外界创建对象,所以并不需要实例化工厂类对象,只需要为外界提供类方法即可。
举个例子如下所示 比如说我们有一个水果工厂,我们可以在里面创建水果,就根据外面外面传入的枚举值的不同创建不同的水果。水果实例的创建是依赖于工厂的
typedef NS_ENUM(NSInteger) {
kApple,
kOrange,
kBanana
} FruitsType;
工厂方法
+ (Fruits *)fruitsFactory:(FruitsType)type {
Fruits *fruits = nil;
switch (type) {
case kApple:
fruits = [[Apple alloc] init];
break;
case kOrange:
fruits = [[Orange alloc] init];
break;
case kBanana:
fruits = [[Banana alloc] init];
default:
break;
}
return fruits;
}
然后再去创建一个抽象水果类
#import <Foundation/Foundation.h>
@interface Fruits : NSObject
@end
然后再去创建具体的这个抽象类的子类,Apple Orange,Banana。就可以了,然后在外界调用的时候只用这么调用就可以了,这样就可以创建出苹果了。
Apple *apple = (Apple *)[FruitsFactory fruitsFactory:kApple];
当然如果是这样的话那么我们如果要再去增加产品的话肯定又要再去写多写个枚举值以及switch case还要去判断,如果这样的话那么各种判断写在一起肯定是不好维护的,代码会越来越多。也就是说,简单工厂是要创建对象的时需要去传入标识去生产产品,不同产品都是在同一个工厂中生产。
二、工厂模式
所以这个时候我们可以去使用工厂模式,如果说简单工厂模式是一个工厂生产多个产品,那么工厂方法模式就是每一个厂去制造自己的那个产品。就比如说我们首先有一个抽象厂,然后这个抽象的厂后面还有抽象的子厂,子厂当中负责创建自己相应的产品,然后产品的抽象类我们也要去创建,后面的产品的抽象子类就是去继承它,和我们前面工厂的抽象子类其实是一一对应的关系。
代码如下所示,首先有了一个抽象的生成有颜色视图的工厂类,里面定义一个抽象的方法
@interface ColorViewGenerator : NSObject
- (ColorView *)colorViewWithFrame:(CGRect)frame;
@end
下面就是去创建这个抽象工厂的子厂,比如说创建红色view和蓝色view的工厂里面去实现这个方法就可以了
@implementation RedViewGenerator
- (ColorView *)colorViewWithFrame:(CGRect)frame {
return [[RedView alloc] initWithFrame:frame];
}
@end
@implementation BlueViewGenerator
- (ColorView *)colorViewWithFrame:(CGRect)frame {
return [[BlueView alloc] initWithFrame:frame];
}
然后再去创建抽象产品的抽象类
@interface ColorView : UIView
//产品的抽象方法
@end
然后去具体实现的抽象类的子类
@implementation RedView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor redColor];
UIImage *backgroundImage = [UIImage imageNamed:@"tupian"];
UIImageView *backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];
[self addSubview:backgroundView];
}
return self;
}
@end
@implementation BlueView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor blueColor];
UIImage *backgroundImage = [UIImage imageNamed:@"tupian2"];
UIImageView *backgroundView = [[UIImageView alloc] initWithImage:backgroundImage];
[self addSubview:backgroundView];
}
return self;
}
@end
具体使用,其实工厂模式的核心思想,就是解耦需求、工厂、和产品。
ColorViewGenerator *colorGen = [[RedViewGenerator alloc] init];
CGRect rect = CGRectMake(0, 0, 300, 600);
ColorView *red = [colorGen colorViewWithFrame:rect];
三、抽象工厂
抽象工厂其实就是指如果一个工厂可以生产多个产品,就比如说我有一个抽象工厂可以创建空调和冰箱,然后这个抽象工厂下面可以创建出一个格力工厂,美的工厂,格力工厂可以创造空调和冰箱,当然美的工厂也可以。这样其实就可以解决我工厂方法中无法解决的一个工厂中创造对个产品并且可以相对每一个产品还可以进行对比。关于抽象工厂和工厂方法的区别如下所示
抽象工厂的话其实就是在一个类中可以创建多个系列的产品,但是必须要去修改工厂抽象类的接口才可以去创建新的产品
工厂方法的话其实就是通过类的继承去创建抽象的产品,每个工厂只能创建一个产品,要创建新的产品就去创建工厂的抽象子类,然后再去创建产品类。
在ios中其实NSNumber就用到了工厂模式,我们初始化NSNumber会发现它为nil,其实他就是一个抽象类,是不能被创建的,可以被继承
NSNumber * num = [[NSNumber alloc]init];
NSNumber * intNum = [NSNumber numberWithInt:10];
NSNumber * floatNum = [NSNumber numberWithFloat:1.0f];
NSNumber * boolNum = [NSNumber numberWithBool:YES];
//关于description方法NSObject对该方法的实现只是打印类的名称,调试器的printobject命令调用此方法来生成一个对象的文本描述
NSLog(@"num = %@",[[num class]description]);
NSLog(@"int num = %@",[[intNum class]description]);
NSLog(@"float num = %@",[[floatNum class]description]);
NSLog(@"bool num = %@",[[boolNum class]description]);