我正在努力在ObjC中使用构建器模式创建不可变对象。假设我有一个具有以下属性的用户对象:
为了确保不变性,我建议使用以下代码:
@protocol User
@property (nonatomic, strong, readonly) NSString *const firstName;
@property (nonatomic, strong, readonly) NSString *const lastName;
@end
@interface User: NSObject<User>
- (instancetype)initWithFirstName:(NSString *)fName withLastName:(NSString *)lName;
@end
@implementation User
@synthesize firstName;
@synthesize lastName;
- (instancetype)initWithFirstName:(NSString *)fName withLastName:(NSString *)lName
{
NSParameterAssert(fName);
NSParameterAssert(lName);
if (self = [super init]) {
self->firstName = [fName copy];
self->lastName = [lName copy];
}
return self;
}
@end
我真正在努力的是如何为这个不可变对象实现一个Builder?
Builder上有用的链接:
答案 0 :(得分:0)
您在上面发布的链接使用两个对象来实现构建器模式。一个专用的构建器对象,随后传递给返回要构建的对象的create/build
方法。这是一个使用不可变对象实现构建器模式的完全人为的例子。
首先让我们创建一个不可变对象;将由构建器对象构建的对象。
@interface Person: NSObject
@property (nonatomic, readonly) NSString *firstName;
@property (nonatomic, readonly) NSString *lastName;
@end
@implementation Person
- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName{
self = [super init]
if(!self) return nil;
_firstName = [firstName copy];
_lastName = [lastName copy];
return self;
}
@end
现在让我们创建构建器对象。
@interface PersonBuilder: NSObject
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
- (Person *)create;
@end
@implementation PersonBuilder
- (Person *)create{
return [[Person alloc] initWithFirstName:self.firstName lastName:self.lastName];
}
@end
实施课程
PersonBuilder *builder = [PersonBuilder new];
builder.firstName = "John";
builder.lastName = "Doe";
Person *john = [builder create];
在Objective-C中我真的没有理由去实现构建器模式,除非你试图避免一个冗长且令人困惑的构造函数签名,或者一个对象只有两个很多属性或选项,例如{{ 1}}。构建器模式实质上允许您将复杂不可变对象的初始化拆分为多个简单的setter调用。在构建器上实现的NSDateComponent
方法还为您提供了一个挂钩点,您可以在其中验证是否正在根据需要创建对象。我只会在极少数情况下使用这种模式。