Шаблон построителя в цели C

Я наткнулся на шаблон проектирования «Строитель», который, как мне кажется, хорошо подходит для того, что я хотел бы сделать. В моем приложении iOS у меня есть разные объекты основных данных, и я хотел бы иметь возможность преобразовывать свои объекты в разные форматы данных. В настоящее время я планирую поддерживать XML, HTML и JSON. Итак, я подумал о разработке этого решения с использованием стандартного шаблона проектирования, такого как «Builder». Некоторые из моих вопросов

  1. Является ли шаблон Builder правильным для этой проблемы?
  2. Могу ли я использовать этот шаблон в Objective C? Поскольку в Obj C нет понятия абстрактного класса, не знаю, как к этому подойти. Я думаю, что мне следует использовать базовый класс и протокол для определения моих абстрактных методов.

Пожалуйста, не стесняйтесь предлагать какие-либо новые дизайнерские решения, которые лучше всего соответствуют моим потребностям.

Большое спасибо за ваши предложения и комментарии.

С уважением, Джавид

Отредактировано: Еще один ключевой момент — окончательный формат будет состоять из различных основных объектов данных. Например, если есть команда и игрок, мне нужно создать формат данных, который использует и команду, и игрока.


person user320587    schedule 20.04.2011    source источник


Ответы (2)


1) Да, шаблон Builder звучит как хорошее решение этой проблемы. Идея Builder заключается в том, что общий процесс сборки согласован для всех форматов данных, но детали сборки различаются.

2) Да, шаблон Builder можно использовать в Objective C. Директор и различные классы ConcreteBuilder будут обычными классами, а абстрактный класс Builder будет протоколом, который использует Директор, если он вообще представлен.

Вы можете получить что-то вроде этого в директоре:

@implementation Director
- (void)construct {
    for (Team* team in self.allTeams) {
        [self.builder buildTeamStart];
        for (Player* player in team.allPlayers)
            [self.builder buildPlayer];
        [self.builder buildTeamEnd];
    }
}
person Daniel T.    schedule 21.04.2011
comment
Спасибо Даниэль. Одно быстрое уточнение: класс ConcreteBuilder будет правильно реализовывать протокол Builder? - person user320587; 21.04.2011
comment
Да, все ConcrerteBuilders будут реализовывать протокол Builder. Лучший способ создать код — создать один ConcreteBuilder одновременно с созданием Director, обращая внимание на то, что является общим для всех схем построения. (Обычные вещи идут в директоре.) Как только вы заработаете, создание двух других ConcreteBuilder должно быть легким. - person Daniel T.; 22.04.2011

Вы можете использовать Категории, чтобы расширить поведение объектов.

например, если вы хотите добавить возможность stringJSON в NSDictionary, вы можете сделать следующее:

NSDictionary+JSON.h:

@interface NSDictionary (json)
-(NSString *) stringJSON;
@end

NSDictionary+JSON.m

@implementation NSDictionary (json)
-(NSString *) stringJSON {
    return @"{key:\"...\"}";
}
@end

Теперь в любом файле .m, который вы хотите использовать для своих объектов NSDictionary, вы включаете категорию

#include "NSDictionary+JSON.h"

и используйте так:

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"value",@"key", nil];
NSLog(@"%@",[dict stringJSON]);

Несколько ссылок: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html#//apple_ref/doc/uid/TP30001163-CH20-SW1

http://cocoadevcentral.com/d/learn_objectivec/

person jsmp    schedule 20.04.2011
comment
Привет jsmp, Спасибо за предложение. Я думаю, что я упустил ключевой момент в моем описании проблемы. Моя конечная цель — создать сложный объект, который будет использовать несколько основных объектов данных. Например, если есть команда и игрок, я хотел бы создать представление команды со всеми игроками. - person user320587; 21.04.2011
comment
Это может помочь stackoverflow.com/ вопросы/2362323/ - person jsmp; 21.04.2011