2015-07-14 3 views
1

Что я борется с созданием неизменяемого объекта с шаблоном строителя в ObjC. Скажем, у меня есть пользовательский объект со следующими свойствами:Как создать неизменяемый объект вместе с шаблоном Builder в ObjC?

  1. имя
  2. фамилии

Для обеспечения неизменности я предлагаю следующий код:

@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:

The Builder Pattern in ObjC

Builder Pattern definiton

ответ

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 Я не вижу особых оснований для реализации шаблона строитель, если вы пытаетесь избежать долгой и запутанной конструктор подписи или, если объект просто имеет два множества свойств или опций, таких как NSDateComponent. Шаблон компоновщика по существу позволяет разделить инициализацию сложного неизменяемого объекта на несколько простых вызовов сеттера. Метод create/build, реализованный в построителе, также дает точку крючка, в которой вы можете проверить, что объект создается, как вы хотите. Я бы использовал эту модель в редких случаях.

Смежные вопросы