iOS开发技术

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

2018-11-27  本文已影响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。

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

源码下载

上一篇下一篇

猜你喜欢

热点阅读