1.生成器模式的定义

将一个复杂的对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表示

2.生成器模式的UML

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. Objective-C 桥接模式 -- 简单实用和说明

    桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥控器两个抽象类, 让这两个抽象类耦合 然后生成这两个抽象类的实例XBox & ...

  2. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  3. OC编程之道-创建对象之生成器模式

    生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...

  4. zw版_Halcon图像交换、数据格式、以及超级简单实用的DIY全内存计算.TXT

    zw版_Halcon图像交换.数据格式.以及超级简单实用的DIY全内存计算.TXT Halcon由于效率和其他原因,内部图像采用了很多自有格式,提高运行速度,但在数据交换方面非常麻烦. 特别是基于co ...

  5. javascript设计模式-生成器模式(Builder)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 设计模式(二): BUILDER生成器模式 -- 创建型模式

    1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...

  7. Linux下好用的简单实用命令

    1.你是否为在输入了一大串命令之后发现第一个字符打错了而苦恼?只能删除重来嘛?或者一步步左移光标? NO,一个组合键轻松搞定 Ctrl+A -----到命令行首 Ctrl+E ------到命令行末 ...

  8. Java设计模式:生成器模式

    问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...

  9. 设计模式(4)建造者模式/生成器模式(Builder)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...

随机推荐

  1. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  2. Markdown 图片助手-MarkdownPicPicker

    title: Markdown 图片助手 v0.1 toc: true comments: true date: 2016-06-04 16:40:06 tags: [Python, Markdown ...

  3. 清空Github上某个文件的历史版本

    title: 清空Github上某个文件的历史版本 author: 青南 date: 2015-01-08 16:04:53 categories: [经验] tags: [Github,histor ...

  4. jQuery学习之路(1)-选择器

    ▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...

  5. 手动添加kdump

    背景:     Linux嵌入式设备内核挂死后,无法自动重启,需要手动重启.而且如果当时没有连串口的话,就无法记录内核挂死时的堆栈,所以需要添加一种方式来记录内核挂死信息方便以后调试使用.设备中增加k ...

  6. 初步认识TDD

    TDD,测试驱动开发(Test Driven Development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名.本文将对TDD有一个较为系统的认识.    基础属性 ...

  7. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  8. 微信小程序体验(1):携程酒店机票火车票

    在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...

  9. iOS:以前笔记,未整理版。太多了,先放着吧。。。。。。。

    1. -(void)timetick { _d = 0; NSTimer *newtime =[NSTimer scheduledTimerWithTimeInterval:1 target:self ...

  10. Topshelf 支持Mono 扩展Topshelf.Linux

    使用Topshelf 5步创建Windows 服务 这篇文章大家可以了解到使用Topshelf可以很好的支持Windows服务的开发,但是它和Mono不兼容,Github上有一个扩展https://g ...