摘要:针对此类关系的设计模式称为生成器。根据中文翻译的不同,建造者模式又可以称为生成器模式。和形成一种聚合关系产品角色类图时序图第三板斧生成器与抽象工厂的对比两者有相似之处。
第一板斧 何为生成器模式?
有时,构建某些对象有多种不同方式。如果这些逻辑包含在构建这些对象的类的单一方法中,构建的逻辑就会变得非常复杂(比如,针对各种构建需求的一大片嵌套if-else或者switch-case语句)。如果能够把构建过程分解为客户——指导者——生成器的关系,那么过程将更容易管理与复用。针对此类关系的设计模式称为生成器。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
如果我们用了生成器模式,那么用户就只需指定需要建造的类型就可以到带到它们,而建造的过程和细节就不需知道了。
第二板斧 生成器结构建造者模式包含如下角色:
Builder:抽象建造者
Builder是一个抽象接口,声明了一个buildPart方法,该builder方法由ConcreteBuilder实现,以构造实际产品(Product).
ConcreteBuilder:具体建造者
Director:指挥者
Director定义了一个construct方法,命令Builder的实例去buildPart。Director和Builder形成一种聚合关系.
Product:产品角色
类图
时序图
第三板斧 生成器与抽象工厂的对比两者有相似之处。但是,一方面生成器关注的是分步创建复杂对象,很多时候同一类型的对象可以以不同的方式创建。另一方面,抽象工厂的重点在于创建简单或复杂产品的套件,生成器在多步创建过程的最后一步返回产品,而抽象工厂会立即返回产品
生成器 | 抽象工厂 |
---|---|
构建复杂对象 | 构件简单或复杂对象 |
以多个步骤构建对象 | 以单一步骤构建对象 |
以多种方式构建对象 | 以单一方式构建对象 |
在构建过程的最后一步返回产品 | 立刻返回产品 |
专注一个特定产品 | 强调一套产品 |
Car (Product)
CarBuilder (Builder)
CarDirector (Director)
SUVCarBuilder
SedanCarBuilder
@interface Car : NSObject @property (nonatomic, assign) NSUInteger wheel; // 轮毅 @property (nonatomic, assign) CGFloat engine; // 发动机 @property (nonatomic, assign) CGFloat chassis; // 底盘 @property (nonatomic, assign) CGSize size; // 车身 /// 跑起来 - (void)run; @end
@interface CarBuilder : NSObject @property (nonatomic, strong) Car *car; /// 组装车轮 - (void)buildWheel; /// 组装车身 - (void)buildBody; /// 组装发动机 - (void)buildEngie; /// 组装底盘 - (void)buildChassis; /// 得到产品 - (Car *)getCar; @end
@implementation CarBuilder - (instancetype)init { self = [super init]; if (self) { _car = [[Car alloc] init]; } return self; } /// 组装车轮 - (void)buildWheel { NSAssert(NO, @"必须创建具体车轮"); self.car.wheel = 0; } /// 组装车身 - (void)buildBody { NSAssert(NO, @"必须创建具体车身"); self.car.size = CGSizeZero; } /// 组装发动机 - (void)buildEngie { NSAssert(NO, @"必须创建具体发动机"); self.car.engine = 0; } /// 组装底盘 - (void)buildChassis { NSAssert(NO, @"必须创建具体底盘"); self.car.chassis = 0; } /// 得到产品 - (Car *)getCar { // doSomething... return self.car; }
@implementation SUVCarBuilder /// 组装车轮 - (void)buildWheel { self.car.wheel = 20; } /// 组装车身 - (void)buildBody { self.car.size = CGSizeMake(100, 50); } /// 组装发动机 - (void)buildEngie { self.car.engine = 2.5f; } /// 组装底盘 - (void)buildChassis { self.car.chassis = 30; } @end
- (void)viewDidLoad { [super viewDidLoad]; self.carDirdector = [[CarDirector alloc] init]; } - (IBAction)SUVButtonTap:(id)sender { SUVCarBuilder *SUVBuilder = [[SUVCarBuilder alloc] init]; self.carDirdector.builder = SUVBuilder; Car *SUVCar = [self.carDirdector construct]; [SUVCar run]; } - (IBAction)SedanButtonTap:(id)sender { SedanCarBuilder *SedanBuilder = [[SedanCarBuilder alloc] init]; self.carDirdector.builder = SedanBuilder; Car *SedanCar = [self.carDirdector construct]; [SedanCar run]; }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/16525.html
摘要:环境基础开发工具使用软件包管理器的三板斧查看软件包安装软件卸载软件和互传文件的三种模式的转换命令模式插入模式底行模式编译器使用函数库调试器使用项目自动化构建工具软件包管理器软件包和软件包管理器就好比手机上的和应用 ...
摘要:前言是现在几乎每个项目中必备的一个东西,但是其工作原理避不开对的解析在生成的过程,有引擎,早期了项目,了解这个之前我们先来看看这种引擎解析出来是什么东西。 前言 babel是现在几乎每个项目中必备的一个东西,但是其工作原理避不开对js的解析在生成的过程,babel有引擎babylon,早期fork了项目acron,了解这个之前我们先来看看这种引擎解析出来是什么东西。不光是babel还有...
摘要:函数名列出某个函数的源代码,含函数名上下各五行类比调试或从开始连续而非单步执行程序遇到断点停下。相当于中的或单条执行。 目录 一、调试器gdb 1、可以使用gdb的可执行文件生成 2、使用命令 1、开始调试和退出调试 2、list 3、类比vs调试 4、代码调试三剑客 5、变量 6、断点 二...
摘要:常见的八大排序算法,他们之间关系如下被人忽视的面向对象的六大原则后端掘金前言作为文集的第一篇,我觉得有必要介绍一下大概的写作规划。 Java多线程干货系列—(四)volatile关键字| 掘金技术征文 - 掘金原本地址:Java多线程干货系列—(四)volatile关键字博客地址:http://tengj.top/ 前言 今天介绍下volatile关键字,volatile这个关键字可能...
摘要:常见的八大排序算法,他们之间关系如下被人忽视的面向对象的六大原则后端掘金前言作为文集的第一篇,我觉得有必要介绍一下大概的写作规划。 Java多线程干货系列—(四)volatile关键字| 掘金技术征文 - 掘金原本地址:Java多线程干货系列—(四)volatile关键字博客地址:http://tengj.top/ 前言 今天介绍下volatile关键字,volatile这个关键字可能...
阅读 2137·2021-11-24 09:39
阅读 1864·2021-10-12 10:12
阅读 625·2021-09-24 09:47
阅读 1077·2021-08-19 11:12
阅读 3331·2019-08-29 13:06
阅读 564·2019-08-26 11:43
阅读 2326·2019-08-23 17:20
阅读 1039·2019-08-23 16:52