美文网首页iOS开发技术
iOS设计模式(一)之简单工厂模式

iOS设计模式(一)之简单工厂模式

作者: 小盟城主 | 来源:发表于2018-11-27 15:40 被阅读1552次

    设计模式系列传送门

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


    1、概述

    首先说明一下,简单工厂模式不属于23种GOF设计模式之一。它也称作静态工厂方法模式,是工厂方法模式的特殊实现。

    2、定义

    “专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类。”

    世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例。

    3、结构图

    举个例子
    简单工厂的生活场景,卖水果的小贩,他给你提供苹果,橘子等水果,小贩就是一个工厂,他为你提供苹果,橘子等水果,该场景对应的UML图如下


    简单工厂模式UML图

    简要分析下UML结构图

    协议FruitProtocol具有一个属性name和一个方法createProduct,AppleFruit和OrangeFruit遵从FruitProtocol协议,简单工厂类为FruitFactory,负责根据传入的不同参数FruitType来决定生产的是AppleFruit还是OrangeFruit。

    4、代码如下

    简单工厂模式

    创建协议FruitsProtocol
    再创建水果类AppleFruit以及OrangeFruit类遵从协议
    创建水果工厂FruitFactory

    FruitProtocol.h(协议)

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @protocol FruitProtocol <NSObject>
    /**水果名*/
    @property (nonatomic,copy) NSString *name;
    /**生产水果*/
    -(void)createProduct;
    @end
    
    NS_ASSUME_NONNULL_END
    

    AppleFruit.h

    #import <Foundation/Foundation.h>
    #import "FruitProtocol.h"
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface AppleFruit : NSObject<FruitProtocol>
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    AppleFruit.m

    #import "AppleFruit.h"
    
    @implementation AppleFruit
    
    @synthesize name;
    
    - (void)createProduct {
        NSLog(@"生产%@",self.name);
    }
    
    @end
    

    OrangeFruit.h

    #import <Foundation/Foundation.h>
    #import "FruitProtocol.h"
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface OrangeFruit : NSObject<FruitProtocol>
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    OrangeFruit.m

    #import "OrangeFruit.h"
    
    @implementation OrangeFruit
    
    @synthesize name;
    
    - (void)createProduct {
        NSLog(@"生产%@",self.name);
    }
    
    @end
    

    FruitFactory.h

    #import <Foundation/Foundation.h>
    #import "FruitProtocol.h"
    
    NS_ASSUME_NONNULL_BEGIN
    
    typedef NS_ENUM(NSInteger,FruitType){
        FruitTypeApple,
        FruitTypeOrange,
    };
    
    @interface FruitFactory : NSObject
    
    +(id<FruitProtocol>)initWithType:(FruitType)type;
    
    @end
    
    NS_ASSUME_NONNULL_END   
    

    FruitFactory.m

    #import "FruitFactory.h"
    #import "AppleFruit.h"
    #import "OrangeFruit.h"
    
    @implementation FruitFactory
    
    +(id<FruitProtocol>)initWithType:(FruitType)type{
        id<FruitProtocol> factory = nil;
        switch (type) {
            case FruitTypeApple:
                factory = [[AppleFruit alloc] init];
                break;
            case FruitTypeOrange:
                factory = [[OrangeFruit alloc] init];
                break;
                
            default:
                break;
        }
        
        return factory;
    }
    
    @end
    

    调用简单工厂方法

    #import "ViewController.h"
    #import "FruitFactory.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        id<FruitProtocol> factory1 = [FruitFactory initWithType:FruitTypeApple];
        factory1.name = @"苹果";
        [factory1 createProduct];
        
        
        id<FruitProtocol> factory2 = [FruitFactory initWithType:FruitTypeOrange];
        factory2.name = @"橘子";
        [factory2 createProduct];
        
    }
    
    @end
    

    5、 优缺点

    从上面的介绍可以看出,简单工厂模式的优点是客户端可以直接消费产品,而不必关心具体产品的实现,消除了客户端直接创建产品对象的责任,实现了对责任的分割。
    简单点说就是客户端调用简单明了,不需要关注太多的逻辑。

    缺点是工厂类集中了所有产品的创建逻辑,一旦不能正常工作,整个系统都会受到影响,而且当产品类别多结构复杂的时候,把所有创建工作放进一个工厂来,会使后期程序的扩展较为困难。产品类本身是符合开闭原则的,对扩展开放对修改关闭,但是工厂类却违反了开闭原则,因为每增加一个产品,工厂类都需要进行逻辑修改和判断,导致耦合度太高。例如增加一个BananaFruit,在工厂类FruitFactory就要新增加一个枚举FruitTypeBanana。

    开闭原则:一个软件实体(如类、模块、函数)应当对扩展开放,对修改关闭。
    开放-封闭原则的思想就是设计的时候,尽量让设计的类做好后就不再修改,如果有新的需求,通过新加类的方式来满足,而不去修改现有的类(代码)。

    源码下载

    相关文章

      网友评论

        本文标题:iOS设计模式(一)之简单工厂模式

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