美文网首页iOS Developer
Objective-C 生成器模式 -- 简单实用和说明

Objective-C 生成器模式 -- 简单实用和说明

作者: Jackey_Zhou | 来源:发表于2016-12-27 11:14 被阅读16次

1.生成器模式的定义
将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示

2.生成器模式的UML

Paste_Image.png

Builder :生成器接口,定义创建一个Product各个部件的操作
ConcreteBuilder:具体的生成器的实现类
Product:产品,表示被生成器构建的复杂的对象,包含多个部件
Director:指导者也称导向者,主要用来使用Builder接口 ,已一个统一的接口创建Product对象

比如我们要生产一辆汽车, 简单分为生产发动机, 轮子, 车门, 分别由发动机部门, 轮子部门, 车门部门分别负责生产
由生产调度中心调度, 并将3个部门的产品合成为一辆汽车

首先我们创建一个生产调度中心Build类负责调度其他生产部门, 这个时候需要给生产部门一个约束或者是协议, 比如部门要有统一的生产方法
然后我们以接口的形式创建各个部门的抽象接口
AbstractEngineProtocol.h

#import <Foundation/Foundation.h>
#import <UIKit/UIkit.h>

@protocol AbstractEngineProtocol <NSObject>

@required

/**
 设置发动机尺寸

 @param scale 尺寸大小
 */
- (void)engineScale:(CGFloat)scale;

/**
 设置发动机重量

 @param height 发动机重量
 */
- (void)engineWeight:(CGFloat)height;

/**
 获取发动机信息

 @return 返回发动机信息
 */
- (NSString *)information;

@end

AbstractWheelProtocol.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol AbstractWheelProtocol <NSObject>

@required

/**
 设置轮子个数

 @param number 个数
 */
- (void)wheelNumber:(CGFloat)number;

/**
 返回轮子信息

 @return 轮子信息
 */
- (NSString *)information;

@end

AbstractDoorProtocol.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@protocol AbstractDoorProtocol <NSObject>

@required

/**
 设置门的数量

 @param number 数量
 */
- (void)doorNumber:(CGFloat)number;

/**
 返回车门的信息

 @return 车门信息
 */
- (NSString *)information;

@end

BuildProtocal.h

#import <Foundation/Foundation.h>

@protocol BuildProtocal <NSObject>

@required

/**
 生产部件

 @return 返回部件
 */
- (id)build;

@end

Builder.h

#import <Foundation/Foundation.h>
#import "AbstractDoorProtocol.h"
#import "AbstractWheelProtocol.h"
#import "AbstractEngineProtocol.h"
#import "BuildProtocal.h"

@interface Builder : NSObject

@property (nonatomic, strong) id <BuildProtocal, AbstractEngineProtocol> engine;
@property (nonatomic, strong) id <BuildProtocal, AbstractWheelProtocol> wheel;
@property (nonatomic, strong) id <BuildProtocal, AbstractDoorProtocol> door;

/**
 产品信息
 */
@property (nonatomic, strong) NSDictionary *productInfo;

/**
 构建所有部件

 @return 返回产品
 */
- (id)buildAllParts;

@end

Builder.m

#import "Builder.h"

@implementation Builder

- (id)buildAllParts {
    
    //创建部件
    [self.engine build];
    [self.wheel build];
    [self.door build];
    
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    
    //组装产品
    dict[@"engine"] = [self.engine information];
    dict[@"wheel"]  = [self.wheel information];
    dict[@"door"]   = [self.door information];
    
    self.productInfo = dict;
    
    return self;
}

@end

接下来我们创建各个部门的类, 他们实现部门抽象接口的同时还要遵循调度中心的约束, 实现调度中心的接口

BMWEngine.h

#import <Foundation/Foundation.h>
#import "AbstractEngineProtocol.h"
#import "BuildProtocal.h"

@interface BMWEngine : NSObject <AbstractEngineProtocol, BuildProtocal>


@end

BMWEngine.m

#import "BMWEngine.h"

@implementation BMWEngine

#pragma mark - AbstractEngineProtocol methods

- (void)engineScale:(CGFloat)scale {
    
    //to do
}

- (void)engineWeight:(CGFloat)height {
    
    //to do
}

- (NSString *)information {
    
    return @"BMW Engine, Scale: 10, Height: 100kg";
}

#pragma mark - BuildProtocol method

- (id)build {
    
    return [BMWEngine new];
}

@end

MIQIWheel.h

#import <Foundation/Foundation.h>
#import "BuildProtocal.h"
#import "AbstractWheelProtocol.h"

@interface MIQIWheel : NSObject <BuildProtocal, AbstractWheelProtocol>

@end

MIQIWheel.m

#import "MIQIWheel.h"

@implementation MIQIWheel

#pragma mark - AbstractWheelProtocol methods

- (void)wheelNumber:(CGFloat)number {
    
    //to do
}

- (NSString *)information {
    
    return @"MIQI Wheel, number: 4";
}

#pragma mark - BuildProtocol method


- (id)build {
        
    return [MIQIWheel new];
}

@end

BMWDoor.h

#import <Foundation/Foundation.h>
#import "BuildProtocal.h"
#import "AbstractDoorProtocol.h"

@interface BMWDoor : NSObject <BuildProtocal, AbstractDoorProtocol>

@end

BMWDoor.m

#import "BMWDoor.h"

@implementation BMWDoor

#pragma mark - AbstractDoorProtocol methods

- (void)doorNumber:(CGFloat)number {
    
    //to do
}

- (NSString *)information {
    
    return @"BMW Door, number: 4";
}

#pragma mark - BuildProtocol method

- (id)build {
    
    return [BMWDoor new];
}

@end

下面是在Controller中实现

#import "ViewController.h"
#import "Builder.h"
#import "BMWEngine.h"
#import "BMWDoor.h"
#import "MIQIWheel.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    //创建一个建造调控中心
    Builder *builder = [[Builder alloc] init];
    
    //配置生产组件单位
    builder.engine = [[BMWEngine alloc] init];
    builder.wheel  = [[MIQIWheel alloc] init];
    builder.door   = [[BMWDoor alloc] init];
    
    //生产
    id product = [builder buildAllParts];
    
    //打印产品信息
    NSLog(@"%@", [product productInfo]);
}


@end

相关文章

  • Objective-C 生成器模式 -- 简单实用和说明

    1.生成器模式的定义将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示 2.生成器模式的U...

  • Objective-C 桥接模式 -- 简单实用和说明

    桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥...

  • 生成器模式

    生成器模式是iOS设计模式中比较简单的一种模式,也经常拿来和抽象工厂作对比。首先我们说下什么事生成器模式。该模式由...

  • Objective-C类族和工厂模式

    Objective-C类族和工厂模式 Objective-C类族和工厂模式

  • Objective-C生成器模式

    假如有以下实体类 实体类声明(.h) 通常可以有以下创建方法: 方法1: 这种方法的缺点是时间久了会记不住这个类到...

  • 设计模式小结

    设计模式 7 大原则 创建型 单例模式 原型模式 创建者模式(生成器模式) 简单工厂模式 工厂方法模式 抽象工厂模...

  • chapter14_剩下的模式

    生成器模式(1) 又称建造者模式,将构建过程和表示过程进行分离,让(参数)构建过程变得更加的简单和直观。另一种差不...

  • 委托与通知

    objective-c it分类:IOS 委托(Delegation) 委托是一种设计模式。这种模式虽然简单但是功...

  • 工厂模式

    工厂模式分为 简单工厂模式, 工厂模式, 抽象工厂模式 三种. 这里有三个概念: 产品, 工厂, 工厂生成器工厂生...

  • 使用 Flask + jQuery + Chartist.js

    Chartist.js 是一个非常简单而且实用的 JavaScript 前端图表生成器,它支持 SVG 格式,图表...

网友评论

    本文标题:Objective-C 生成器模式 -- 简单实用和说明

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