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 = ;
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 = ;
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 = ;
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);
结果:
-- ::04.298 Builder[:] benz: name = benz ,speed =
-- ::04.298 Builder[:] BMW: name = BMW ,speed =
可以看到,不同的builder封装不同的创建对象逻辑,产生不同的对象,同时分离了创建层和表示层。
Objective-C设计模式——生成器Builder(对象创建)的更多相关文章
- Builder(生成器)-对象创建型模式
一.意图 将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示. 二.动机 一个复杂的对象的构造过程中,原料相同,可能会要求生产不同的产品,并且生产的产品种类还能够方便的增加.Bu ...
- 设计模式---对象创建模式之构建器模式(Builder)
一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象 ...
- 设计模式03: Builder 生成器模式(创建型模式)
Builder生成器模式(创建型模式) Builder模式缘起假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分富于变化.如果使用最直观的设计方法,每个房屋部分的变化,都将 ...
- 跟着实例学习设计模式(6)-生成器模式builder(创建型)
生成器模式是创建型设计模式. 设计意图:将一个复杂的类表示与其构造相分离,使得同样的构建过程可以得出不同的表示. 实例类图: IVehicleBuilder:抽象建造者.为创建一个Vehicle对象并 ...
- C++设计模式 之 “对象创建”模式:Factory Method、Abstract Factory、Prototype、Builder
part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fact ...
- 23种设计模式 - 对象创建(FactoryMethod - AbstractFactory - Prototype - Builder)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 对象创建 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦 ...
- 设计模式之生成器(Builder)模式
意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以表示不同的表示. 适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同的表 ...
- C#设计模式——生成器模式(Builder Pattern)
一.概述在软件系统中,有时候面临着复杂的对象创建,该对象由一定算法构成的子对象组成,由于需求变化,这些子对象会经常变换,但组合在一起的算法却是稳定的.生成器模式可以处理这类对象的构建,它提供了一种封装 ...
- 【转】设计模式(三)建造者模式Builder(创建型)
(http://blog.csdn.net/hguisu/article/details/7518060) 1. 概述 在软件开发的过程中,当遇到一个"复杂的对象"的创建工作,该对 ...
随机推荐
- 洛谷——P1036 选数
题目描述 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12, ...
- Ubuntu 16.04 GNOME添加桌面图标/在桌面上显示图标
GNOME默认不能在桌面上创建文件夹,但是可以通过工具设置:用gnome-tweak-tool设置Nautilus接管桌面即可. 安装: sudo apt-get install gnome-twea ...
- HTTPS 是如何保证安全的?
每当我们讨论到信息安全的时候,我们最长接触到的信息加密传输的方式莫过于 HTTPS 了,当我们浏览器地址栏闪现出绿色时,就代表着这个网站支持 HTTPS 的加密信息传输方式,并且你与它的连接确实被加密 ...
- Android GIS开发系列-- 入门季(11) Callout气泡的显示
一.气泡的简单显示 首先我们要获取MapView中的气泡,通过MapView的getCallout()方法获取一个气泡.看一下Callout的简单介绍: 大体的意思是通过MapView获取Callou ...
- ubuntu12.04+cuda6.0+opencv2.4.9
更新了cuda之后,opencv的gpu模块又要重新编译了,这个地方有一个疑问,我对cuda6.0装了两次,第一次装好之后,没有配一个bumblebee,重装了cuda6.0之后,发现原来编译的ope ...
- tmux还有这种操作,我在这边的窗口上操作,你那边可以实时的看到我的操作,厉害了
- C# VS如何整个项目中查找字符串
Ctrl+F打开查找对话框,然后输入查找字符串,电机右边的小三角,选择整个解决方案,就可以遍历所有文件查找指定字符了
- Linux学习日志--文件搜索命令
开头总结: 学习了Linux中的文件搜索命令find和locate,系统搜索命令whereis 和which ,字符串搜索命令grep,find和locate的差别和使用方法格式,什么是path环境变 ...
- 怎样用ccache加速cocos2d-x android版本号的编译
下面步骤在MAC下測试通过: 首先是安装CCache, 能够用homebrew brew install --HEAD ccache 也能够用源代码安装 git clone https://githu ...
- Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作
Oracle 远程访问配置 服务端配置 如果不想自己写,可以通过 Net Manager 来配置. 以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问. 1.网络监听配置 ...