Skip to content

Instantly share code, notes, and snippets.

@MaximAlien
Last active January 2, 2016 21:11
Show Gist options
  • Save MaximAlien/2a4a92fd9eff9a73fabb to your computer and use it in GitHub Desktop.
Save MaximAlien/2a4a92fd9eff9a73fabb to your computer and use it in GitHub Desktop.
[Objective-C] Builder Design Pattern
// 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