Objective-C 生成器模式 -- 简单实用和说明
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 生成器模式 -- 简单实用和说明的更多相关文章
- Objective-C 桥接模式 -- 简单实用和说明
桥接模式---把两个相关联的类抽象出来, 以达到解耦的目的 比如XBox遥控器跟XBox主机, 我们抽象出主机和遥控器两个抽象类, 让这两个抽象类耦合 然后生成这两个抽象类的实例XBox & ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- OC编程之道-创建对象之生成器模式
生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式.client(客户)-director(指导者)-builder(构造者)-product(产品). 生成器模式能帮助构建设计部件与表现的各 ...
- zw版_Halcon图像交换、数据格式、以及超级简单实用的DIY全内存计算.TXT
zw版_Halcon图像交换.数据格式.以及超级简单实用的DIY全内存计算.TXT Halcon由于效率和其他原因,内部图像采用了很多自有格式,提高运行速度,但在数据交换方面非常麻烦. 特别是基于co ...
- javascript设计模式-生成器模式(Builder)
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 设计模式(二): BUILDER生成器模式 -- 创建型模式
1.定义 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2.适用场景 1. 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式 ...
- Linux下好用的简单实用命令
1.你是否为在输入了一大串命令之后发现第一个字符打错了而苦恼?只能删除重来嘛?或者一步步左移光标? NO,一个组合键轻松搞定 Ctrl+A -----到命令行首 Ctrl+E ------到命令行末 ...
- Java设计模式:生成器模式
问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...
- 设计模式(4)建造者模式/生成器模式(Builder)
设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 设计模式(3)抽象工厂模式(Abstract Factory) 源 ...
随机推荐
- 【.net 深呼吸】细说CodeDom(7):索引器
在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...
- PHP实现RTX发送消息提醒
RTX是腾讯公司推出的企业级即时通信平台,大多数公司都在使用它,但是我们很多时候需要将自己系统或者产品的一些通知实时推送给RTX,这就需要用到RTX的服务端SDK,建议先去看看RTX的SDK开发文档( ...
- HTML5 localStorage本地存储
介绍 localStorage(本地存储)的使用方式.包括对存储对象的添加.修改.删除.事件触发等操作. 目录 1. 介绍 1.1 说明 1.2 特点 1.3 浏览器最小版本支持 1.4 适合场景 2 ...
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
- Discuz NT 架构剖析之Config机制
接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
- 如何为你的微信小程序体积瘦身?
众所周知,微信小程序在发布的时候,对提交的代码有1M大小的限制!所以,如果你正在写一个功能稍微复杂一点的小程序,就必须得时刻小心注意你的代码是不是快触及这个底线了. 在设计一个小程序之初,我们就需要重 ...
- Maven(一)linux下安装
1.检查是否安装JDK,并且设置了环境变量(JAVA_HOME): echo $JAVA_HOME java -version 运行结果: 显示jdk的安装路径,和java的版本,如: #jdk路径 ...
- MySQL数据库罕见的BUG——Can't get hostname for your address
在连接mysql jdbc时候,抛出了 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communicat ...
- 自定义ConfigSection
CCustom configuration section with intelisense