设计模式系列传送门
iOS设计模式(一)之简单工厂模式
iOS设计模式(二)之工厂模式
iOS设计模式(三)之抽象工厂模式
1、概念描述
简单工厂:工厂可以创建同一系列的产品,产品的接口一致,但工厂就要根据参数进行判断到底创建哪种产品。
水果工厂:根据传入的FruitType来决定是生产苹果还是橘子。
简单工厂存在的问题就是不利于扩展,利于新增加水果就要修改之前的工厂代码,新增加FruitType,不符合开闭原则,相对来说就有了工厂模式。工厂模式:使用OOP的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的接口,然后在具体的工厂中创建具体的产品。
可以有多种工厂,工厂有共同的接口,一个工厂只能产生一种产品,例如AppleFactory只生产Apple,OrangeFactory只生产Orange,比起简单工厂,工厂方法就不需要判断是什么FruitType类型的来生产什么水果,耦合度低了不少。
2、结构图

3、代码如下

其中的FruitProtocol、AppleFruit、OrangeFruit与之前的简单工厂模式的代码相同
AppleFactory.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface AppleFactory : NSObject
+(instancetype)shareInstance;
/**创建工厂*/
-(id<FruitProtocol>)createFactory;
@end
NS_ASSUME_NONNULL_END
AppleFactory.m
#import "AppleFactory.h"
#import "AppleFruit.h"
@implementation AppleFactory
+(instancetype)shareInstance{
static AppleFactory *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
-(id<FruitProtocol>)createFactory{
id<FruitProtocol> factory = [[AppleFruit alloc] init];
factory.name = @"苹果";
return factory;
}
@end
OrangeFactory.h
#import <Foundation/Foundation.h>
#import "FruitProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface OrangeFactory : NSObject
+(instancetype)shareInstance;
/**创建工厂*/
-(id<FruitProtocol>)createFactory;
@end
NS_ASSUME_NONNULL_END
OrangeFactory.m
#import "OrangeFactory.h"
#import "OrangeFruit.h"
@implementation OrangeFactory
+(instancetype)shareInstance{
static OrangeFactory *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
-(id<FruitProtocol>)createFactory{
id<FruitProtocol> factory = [[OrangeFruit alloc] init];
factory.name = @"橘子";
return factory;
}
@end
调用方法
#import "ViewController.h"
#import "AppleFactory.h"
#import "OrangeFactory.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
id<FruitProtocol> factory1 = [[AppleFactory shareInstance] createFactory];
[factory1 createProduct];
id<FruitProtocol> factory2 = [[OrangeFactory shareInstance] createFactory];
[factory2 createProduct];
}
@end
4、工厂方法的优缺点:
与简单工厂模式把所有产品都放到FruitFactory来获取相比,工厂模式每次需要一个新的产品,就需要新建一个具体工厂来生成新的产品。当你需要banana的时候,只要新建一个BananaFruit的产品类,再创建一个BananaFactory的具体工厂类就可以创建新的产品了。对原来的代码都不需要做任何修改。这就使得产品的拓展变得简单。
降低了工厂类的内聚,满足了类之间的层次关系,又很好的符合了面向对象设计中的单一职责原则,这样有利于程序的拓展。
网友评论