Objective-C设计模式——生成器Builder(对象创建)
生成器
生成器,也成为建造者模式,同样是创建对象时的设计模式。该模式下有一个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(对象创建)相关推荐
- Builder(生成器)--对象创建型模式
Builder(生成器)–对象创建型模式 一.意图 将一个复杂的对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 二.动机 1.在软件系统中,有时候面临着"一个复杂对象&quo ...
- 2018.3.31 设计模式之生成器模式详解及例子(对象创建型模式)
设计模式之生成器模式(对象创建型模式) 1.定义/概念 将一个复杂对象的创建和它的表示分离,使得同样的创建过程可以有不同的表示. 2.生成模式角色 Builder: 生成器接口,定义创建一个Produ ...
- C#面向对象设计模式4:生成器(Builder)
生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象. 该模式允许你使用相同的创建代码生成不同类型和形式的对象.它又叫建造者模式. 一.情景 假设有这样一个复杂对象, 在对其进行构造时需要对诸 ...
- 生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]
文章目录 概念 相关图示 代码示例 框架中的应用 场景 多个生成器(Concrete Builder): 单个生成器 概念 生成器设计模式(Builder Design Pattern)是一种创建型设 ...
- C#设计模式——生成器模式(Builder Pattern)
一.概述 在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封 ...
- 李建忠设计模式之“对象创建”模式
文章目录 工厂方法模式(Factory Method) 定义 动机 结构图 代码 要点 总结 抽象工厂模式(Abstract Factory) 定义 动机 结构图 代码 要点 总结 原型模式(Prot ...
- 设计模式之十一:创建模式(Builder Pattern)
GOF 建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 建造者模式主要由以下部分组成. 建造者接口:给出一个接口,以规范产品对象的各个组成成分的建造,这个接口规定 ...
- 设计模式之原型法(ProtoType)----对象创建型模式
设计模式之原型法(ProtoType)----对象创建型模式 1.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用性 1)当要实例化的类是在运行时刻指定时,例如,通过动 ...
- 【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
文章目录 前言 一.静态代理的弊端 二.动态代理的优势 三.动态代理使用流程 1.目标对象接口 2.被代理对象 3.调用处理程序 4.客户端 四.动态生成 代理对象 类 的 字节码 文件数据 前言 代 ...
最新文章
- VB.NET 数组的定义 动态使用 多维数组
- [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...
- 【数据结构】之基本概念和术语
- 一个全栈式的应用集成平台,打破“信息孤岛”
- mysql 不指定 长度吗_mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?...
- BZOJ4810:[YNOI2017]由乃的玉米田(莫队,bitset)
- cad坐标归零lisp_「软件技巧」厉害了!输入简单命令轻松解决CAD几类常见问题...
- odoo10参考系列--视图三(其他高级视图)
- Mybatis 处理日期格式自动转换
- WPF如何得到一个在用户控件内部的元素的坐标位置
- java赋值两个对象数组 clone_有关java对象数组的clone问题
- 黑马程序员顺义校区php_传智播客·黑马程序员顺义新校区来校路线介绍
- python123高次方程求根_GitHub - loveunk/math-advanced-algebra-notes: 根据丘维声的《高等代数》整理...
- android 壁纸尺寸,常见手机壁纸的尺寸是多少
- 第5章 初识SqlSugarCore之内置逻辑分页
- 【无标题】上班族做什么副业赚钱?4种副业让你超过主业!
- Unbox failed! RequestError: Error: connect ETIMEDOUT 151.101.76.133:443
- 【Jenkins】Jenkins容器构建脚本以及容器瘦身docker-slim使用
- UEditor富文本编辑器不显示问题
- 为什么公有云在中国落地难
热门文章
- Eclipse报错:gc overhead limit exceeded eclipse
- saltstack/salt的state.sls的使用
- Java系列: JAVA字符串格式化-String.format()的使用(zz)
- toolkit,phonetextbox中实现用户按回车键会换行
- 在请求和响应中使用 XML
- php roadrunner,使用RoadRunner 加速 Laravel 应用
- 嵌入式Linux下跑自整定pid,告诉过你PID很重要,你不听
- 卸载Win10+ubuntu14双系统中的ubuntu系统
- java注解详解_Java注解详解
- 构建安全的Xml Web Service系列之SSL篇