Last active
January 2, 2016 21:11
-
-
Save MaximAlien/2a4a92fd9eff9a73fabb to your computer and use it in GitHub Desktop.
[Objective-C] Builder Design Pattern
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Builder.h | |
#import <Foundation/Foundation.h> | |
@interface ObjectBuilder : NSObject | |
@property (nonatomic, copy) NSString *name; | |
@property (nonatomic, copy) NSNumber *age; | |
@end | |
@interface Builder : NSObject | |
@property (nonatomic, copy, readonly) NSString *name; | |
@property (nonatomic, copy, readonly) NSNumber *age; | |
- (instancetype)init; | |
- (instancetype)initWithBuilder:(ObjectBuilder *)builder; | |
+ (instancetype)makeWithBuilder:(void (^)(ObjectBuilder *))updateBlock; | |
- (instancetype)update:(void (^)(ObjectBuilder *))updateBlock; | |
@end | |
// Builder.m | |
#import "Builder.h" | |
@implementation ObjectBuilder | |
- (instancetype)init | |
{ | |
if (self = [super init]) | |
{ | |
_name = nil; | |
_age = nil; | |
} | |
return self; | |
} | |
@end | |
@implementation Builder | |
- (instancetype)initWithBuilder:(ObjectBuilder *)builder | |
{ | |
if (self = [super init]) | |
{ | |
_name = builder.name; | |
_age = builder.age; | |
} | |
return self; | |
} | |
- (ObjectBuilder *)makeBuilder | |
{ | |
ObjectBuilder *builder = [ObjectBuilder new]; | |
builder.name = _name; | |
builder.age = _age; | |
return builder; | |
} | |
- (instancetype)init | |
{ | |
ObjectBuilder *builder = [ObjectBuilder new]; | |
return [self initWithBuilder:builder]; | |
} | |
+ (instancetype)makeWithBuilder:(void (^)(ObjectBuilder *))updateBlock | |
{ | |
ObjectBuilder *builder = [ObjectBuilder new]; | |
updateBlock(builder); | |
return [[Builder alloc] initWithBuilder:builder]; | |
} | |
- (instancetype)update:(void (^)(ObjectBuilder *))updateBlock | |
{ | |
ObjectBuilder *builder = [self makeBuilder]; | |
updateBlock(builder); | |
return [[Builder alloc] initWithBuilder:builder]; | |
} | |
@end | |
// Example | |
Builder *builder = [Builder makeWithBuilder:^(ObjectBuilder *builder) | |
{ | |
builder.name = @"Max"; | |
builder.age = @23; | |
}]; | |
NSLog(@"%@", builder.name); | |
Builder *updatedBuilder = [builder update:^(ObjectBuilder *builder) | |
{ | |
builder.name = @"Maxim"; | |
}]; | |
NSLog(@"%@", updatedBuilder.name); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment