美文网首页
iOS设计模式(二)之工厂模式

iOS设计模式(二)之工厂模式

作者: 小盟城主 | 来源:发表于2018-11-27 18:28 被阅读1658次

设计模式系列传送门

iOS设计模式(一)之简单工厂模式
iOS设计模式(二)之工厂模式
iOS设计模式(三)之抽象工厂模式


1、概念描述

简单工厂:工厂可以创建同一系列的产品,产品的接口一致,但工厂就要根据参数进行判断到底创建哪种产品。

水果工厂:根据传入的FruitType来决定是生产苹果还是橘子。
简单工厂存在的问题就是不利于扩展,利于新增加水果就要修改之前的工厂代码,新增加FruitType,不符合开闭原则,相对来说就有了工厂模式。

工厂模式:使用OOP的多态性,将工厂和产品都抽象出一个基类,在基类中定义统一的接口,然后在具体的工厂中创建具体的产品。

可以有多种工厂,工厂有共同的接口,一个工厂只能产生一种产品,例如AppleFactory只生产Apple,OrangeFactory只生产Orange,比起简单工厂,工厂方法就不需要判断是什么FruitType类型的来生产什么水果,耦合度低了不少。

2、结构图

工厂模式UML图

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的具体工厂类就可以创建新的产品了。对原来的代码都不需要做任何修改。这就使得产品的拓展变得简单。
  降低了工厂类的内聚,满足了类之间的层次关系,又很好的符合了面向对象设计中的单一职责原则,这样有利于程序的拓展。

源码下载

相关文章

网友评论

      本文标题:iOS设计模式(二)之工厂模式

      本文链接:https://www.haomeiwen.com/subject/pnggqqtx.html