生成器

生成器,也成为建造者模式,同样是创建对象时的设计模式。该模式下有一个Director(指挥者),客户端知道该类引用用来创建产品。还有一个Builder(建造者),建造者知道具体创建对象的细节。

指挥者只是起到协调的作用,它有一个Builder引用用于指挥Builder如何创建对象,Builder内就是为了构建对象的算法。

其实生成器模式,就是为了定制某些特定对象而产生的模式。对象的过长往往非常的复杂,如果不是用该模式来创建对象,对象创建类将会非常的冗余且难以复用。使用生成器将表现层和创建层分离更加易于扩展和解耦。

使用场景

1.需要创建涉及各种部件的复杂对象。创建对象的算法应该独立于部件的装配方式。常见的例子是构建组合对象。

2.构建过程需要以不同的方式(例如,部件或表现的不同组合)构建对象。

生成器与抽象工厂对比

生成器

构建复杂对象

以多个步骤构建对象

在构建对象过程的最后一步返回产品

专注于一个特定产品

抽象工厂

构建简单或复杂对象

以单一步骤构建对象

以单一方式构建对象

立刻返回产品

强调一套产品

Demo

比如汽车制造厂需要制造两种不同的汽车:

首相创建Car类,有name和speed两个属性

#import <Foundation/Foundation.h>@interface Car : NSObject@property(nonatomic, strong)NSString *name;@property(nonatomic ,assign)int speed;@end#import "Car.h"@implementation Car@end

创建Builder,Builder封装了创建类的具体细节

#import <Foundation/Foundation.h>
#import "Car.h"@interface CarBuilder : NSObject-(CarBuilder *)buildCar;
-(CarBuilder *)buildCarName;
-(CarBuilder *)buildCarSpeed;
-(Car *)getProduct;@end#import "CarBuilder.h"@implementation CarBuilder
{Car *_product;}
-(CarBuilder *)buildCar
{_product =  nil;_product = [Car new];return self;
}-(CarBuilder *)buildCarName
{_product.name = @"benz";return self;
}-(CarBuilder *)buildCarSpeed
{_product.speed = 100;return self;
}@end

具体的Builder类:

#import <Foundation/Foundation.h>
#import "CarBuilder.h"@interface CarBuilderBenz : CarBuilder@end#import "CarBuilderBenz.h"@implementation CarBuilderBenz
{Car *_product;
}-(CarBuilder *)buildCar
{_product =  nil;_product = [Car new];return self;
}-(CarBuilder *)buildCarName
{_product.name = @"benz";return self;
}-(CarBuilder *)buildCarSpeed
{_product.speed = 100;return self;
}-(Car *)getProduct
{return _product;
}@end#import <Foundation/Foundation.h>
#import "CarBuilder.h"
@interface CarBuilderBMW : CarBuilder@end#import "CarBuilderBMW.h"@implementation CarBuilderBMW
{Car *_product;
}-(CarBuilder *)buildCar
{_product =  nil;_product = [Car new];return self;
}-(CarBuilder *)buildCarName
{_product.name = @"BMW";return self;
}-(CarBuilder *)buildCarSpeed
{_product.speed = 120;return self;
}-(Car *)getProduct
{return _product;
}
@end

Director类,Director知道生产产品,但并不知道具体生产细节。

#import <Foundation/Foundation.h>
#import "CarBuilder.h"
#import "Car.h"@interface CarDirector : NSObject-(Car *)createCarBenz:(CarBuilder *)builder;
-(Car *)createCarBMW:(CarBuilder *)builder;@end#import "CarDirector.h"@implementation CarDirector-(Car *)createCarBenz:(CarBuilder *)builder
{[builder buildCar];[builder buildCarName];[builder buildCarSpeed];return [builder getProduct];
}-(Car *)createCarBMW:(CarBuilder *)builder
{[builder buildCar];[builder buildCarName];[builder buildCarSpeed];return [builder getProduct];
}@end

客户端代码:

        CarDirector *director = [CarDirector new];CarBuilderBenz *benzBuilder = [CarBuilderBenz new];CarBuilderBMW *BMWBuilder = [CarBuilderBMW new];Car *benz = [director createCarBenz:benzBuilder];Car *bmw = [director createCarBMW:BMWBuilder];NSLog(@"benz: name = %@ ,speed = %d",benz.name ,benz.speed);NSLog(@"BMW: name = %@ ,speed = %d",bmw.name ,bmw.speed);

结果:

2015-07-21 09:15:04.298 Builder[41745:10008190] benz: name = benz ,speed = 100
2015-07-21 09:15:04.298 Builder[41745:10008190] BMW: name = BMW ,speed = 120

可以看到,不同的builder封装不同的创建对象逻辑,产生不同的对象,同时分离了创建层和表示层。

转载于:https://www.cnblogs.com/madpanda/p/4663415.html

Objective-C设计模式——生成器Builder(对象创建)相关推荐

  1. Builder(生成器)--对象创建型模式

    Builder(生成器)–对象创建型模式 一.意图 将一个复杂的对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 二.动机 1.在软件系统中,有时候面临着"一个复杂对象&quo ...

  2. 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)

    设计模式之生成器模式(对象创建型模式) 1.定义/概念 将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示. 2.生成模式角色 Builder: 生成器接口,定义创建一个Produ ...

  3. C#面向对象设计模式4:生成器(Builder)

    生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象. 该模式允许你使用相同的创建代码生成不同类型和形式的对象.它又叫建造者模式. 一.情景 假设有这样一个复杂对象, 在对其进行构造时需要对诸 ...

  4. 生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

    文章目录 概念 相关图示 代码示例 框架中的应用 场景 多个生成器(Concrete Builder): 单个生成器 概念 生成器设计模式(Builder Design Pattern)是一种创建型设 ...

  5. C#设计模式——生成器模式(Builder Pattern)

    一.概述 在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封 ...

  6. 李建忠设计模式之“对象创建”模式

    文章目录 工厂方法模式(Factory Method) 定义 动机 结构图 代码 要点 总结 抽象工厂模式(Abstract Factory) 定义 动机 结构图 代码 要点 总结 原型模式(Prot ...

  7. 设计模式之十一:创建模式(Builder Pattern)

    GOF 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式主要由以下部分组成. 建造者接口:给出一个接口,以规范产品对象的各个组成成分的建造,这个接口规定 ...

  8. 设计模式之原型法(ProtoType)----对象创建型模式

    设计模式之原型法(ProtoType)----对象创建型模式 1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用性 1)当要实例化的类是在运行时刻指定时,例如,通过动 ...

  9. 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )

    文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...

最新文章

  1. VB.NET 数组的定义 动态使用 多维数组
  2. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...
  3. 【数据结构】之基本概念和术语
  4. 一个全栈式的应用集成平台,打破“信息孤岛”
  5. mysql 不指定 长度吗_mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...
  6. BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)
  7. cad坐标归零lisp_「软件技巧」厉害了!输入简单命令轻松解决CAD几类常见问题...
  8. odoo10参考系列--视图三(其他高级视图)
  9. Mybatis 处理日期格式自动转换
  10. WPF如何得到一个在用户控件内部的元素的坐标位置
  11. java赋值两个对象数组 clone_有关java对象数组的clone问题
  12. 黑马程序员顺义校区php_传智播客·黑马程序员顺义新校区来校路线介绍
  13. python123高次方程求根_GitHub - loveunk/math-advanced-algebra-notes: 根据丘维声的《高等代数》整理...
  14. android 壁纸尺寸,常见手机壁纸的尺寸是多少
  15. 第5章 初识SqlSugarCore之内置逻辑分页
  16. 【无标题】上班族做什么副业赚钱?4种副业让你超过主业!
  17. Unbox failed! RequestError: Error: connect ETIMEDOUT 151.101.76.133:443
  18. 【Jenkins】Jenkins容器构建脚本以及容器瘦身docker-slim使用
  19. UEditor富文本编辑器不显示问题
  20. 为什么公有云在中国落地难

热门文章

  1. Eclipse报错:gc overhead limit exceeded eclipse
  2. saltstack/salt的state.sls的使用
  3. Java系列: JAVA字符串格式化-String.format()的使用(zz)
  4. toolkit,phonetextbox中实现用户按回车键会换行
  5. 在请求和响应中使用 XML
  6. php roadrunner,使用RoadRunner 加速 Laravel 应用
  7. 嵌入式Linux下跑自整定pid,告诉过你PID很重要,你不听
  8. 卸载Win10+ubuntu14双系统中的ubuntu系统
  9. java注解详解_Java注解详解
  10. 构建安全的Xml Web Service系列之SSL篇