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. .NET Core 系列5 :使用 Nuget打包类库

    NuGet是个开源项目,项目包括 NuGet VS插件/NuGet Explorer/NuGetServer/NuGet命令行等项目,.NET Core项目完全使用Nuget 管理组件之间的依赖关系, ...

  2. 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录

    ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...

  3. solr_架构案例【京东站内搜索】(附程序源代码)

    注意事项:首先要保证部署solr服务的Tomcat容器和检索solr服务中数据的Tomcat容器,它们的端口号不能发生冲突,否则web程序是不可能运行起来的. 一:solr服务的端口号.我这里的sol ...

  4. MVC5+EF6+MYSQl,使用codeFirst的数据迁移

    之前本人在用MVC4+EF5+MYSQL搭建自己的博客.地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在glob ...

  5. VisualStudio2013 如何打开之前版本开发的(.vdproj )安装项目

    当你的项目使用早于 visualstudio2013 的版本开发并且使用 Visual Studio Installer 制作安装项目时,在升级至 VS2013 后会发现新安装项目无法打开, VS20 ...

  6. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  7. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  8. 基于Oracle安装Zabbix

    软件版本 Oracle Enterprise Linux 7.1 64bit Oracle Enterprise Edition 12.1.0.2 64bit Zabbix 3.2.1 准备工作 上传 ...

  9. 为.NET Core项目定义Item Template

    作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常 ...

  10. jQuery幻灯片插件autoPic

    原文地址:Jquery自定义幻灯片插件 插件效果图: 演示地址:autoPic项目地址:autoPic 欢迎批评指正!