建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
优点:
1、将复杂产品的创建步骤分解到不同的方法中,使得创建过程更加清晰,使得我们能够更加精确的控制复杂对象的产生过程。
2、将产品的创建过程与产品本身分离开来,可以使用相同的创建过程来得到不同的产品。也就说细节依赖抽象。
3、每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。
缺点:
1、建造过程模版话,无法灵活修改建造顺序,只适合具有较多共同点的对象使用。
2、如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,可读性降低。
总结:
1、建造者模式是将一个复杂对象的创建过程给封装起来,客户只需要知道可以利用对象名或者类型就能够得到一个完整的对象实例,而不需要关心对象的具体创建过程。
2、建造者模式将对象的创建过程与对象本身隔离开了,使得细节依赖于抽象,符合依赖倒置原则。可以使用相同的创建过程来创建不同的产品对象。
项目地址:https://github.com/GameRisker/Study-Design-Patterns.git
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// // main.m // Builder // // Created by GameRisker on 16/1/31. // Copyright (c) 2016年 GameRisker. All rights reserved. // #import "Builder.h" #import "ConcreteBuilderOne.h" #import "ConcreteBuilderTwo.h" #import "Director.h" #import "Product.h" #import <Foundation/Foundation.h> int main(int argc, const char *argv[]) { @autoreleasepool { // insert code here... Director *director = [[Director alloc] init]; id builderA = [[ConcreteBuilderOne alloc] init]; id builderB = [[ConcreteBuilderTwo alloc] init]; [director Construct:builderA]; Product *pA = [builderA GetResult]; [pA Show]; [director Construct:builderB]; Product *pB = [builderB GetResult]; [pB Show]; } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // Builder.h // // // Created by GameRisker on 16/1/31. // // #import "Product.h" #import <Foundation/Foundation.h> @protocol Builder <NSObject> - (void)BuilderPartA; - (void)BuilderPartB; - (id)GetResult; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // Product.h // // // Created by GameRisker on 16/1/31. // // #import <Foundation/Foundation.h> @interface Product : NSObject @property(strong, nonatomic) NSMutableArray *m_parts; - (void)Add:(NSString *)value; - (void)Show; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// // Product.m // // // Created by GameRisker on 16/1/31. // // #import "Product.h" @implementation Product - (instancetype)init { if (self = [super init]) { self.m_parts = [NSMutableArray arrayWithCapacity:5]; } return self; } - (void)Add:(NSString *)value { if (![self.m_parts containsObject:value]) { [self.m_parts addObject:value]; } } - (void)Show { for (int i = 0;[self.m_parts count] > i; i++) { NSLog(@"%@", [self.m_parts objectAtIndex:i]); } } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// // Director.h // // // Created by GameRisker on 16/1/31. // // #import "Builder.h" #import <Foundation/Foundation.h> @interface Director : NSObject - (void)Construct:(id)builder; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// // Director.m // // // Created by GameRisker on 16/1/31. // // #import "Builder.h" #import "Director.h" @implementation Director - (void)Construct:(id<Builder>)builder { [builder BuilderPartA]; [builder BuilderPartB]; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// // ConcreteBuilderOne.h // // // Created by GameRisker on 16/1/31. // // #import "Builder.h" #import "Product.h" #import <Foundation/Foundation.h> @interface ConcreteBuilderOne : NSObject @property(strong, nonatomic) Product *m_product; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// // ConcreteBuilderOne.m // // // Created by GameRisker on 16/1/31. // // #import "ConcreteBuilderOne.h" @implementation ConcreteBuilderOne - (instancetype)init { if (self = [super init]) { self.m_product = [[Product alloc] init]; } return self; } - (void)BuilderPartA { [self.m_product Add:@" one : builder part a!"]; } - (void)BuilderPartB { [self.m_product Add:@" one : builder part b!"]; } - (id)GetResult { return self.m_product; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// // ConcreteBuilderTwo.h // // // Created by GameRisker on 16/1/31. // // #import "Builder.h" #import "Product.h" #import <Foundation/Foundation.h> @interface ConcreteBuilderTwo : NSObject <Builder> @property(strong, nonatomic) Product *m_product; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// // ConcreteBuilderTwo.m // // // Created by GameRisker on 16/1/31. // // #import "ConcreteBuilderTwo.h" @implementation ConcreteBuilderTwo - (instancetype)init { if (self = [super init]) { self.m_product = [[Product alloc] init]; } return self; } - (void)BuilderPartA { [self.m_product Add:@" two : builder part a!"]; } - (void)BuilderPartB { [self.m_product Add:@" two : builder part b!"]; } - (id)GetResult { return self.m_product; } @end |