Являются ли методы класса лучшим способом в Objective-C для реализации фабричного метода? - PullRequest
3 голосов
/ 25 сентября 2011

Кажется, что в Objective C я вижу много методов классов, подобных +(NSString*)stringWithString:(NSString *)string или +(NSArray)arrayWithArray:(NSArray *)array и т. Д. Я только начинаю рассматривать шаблоны проектирования, и для меня эти методы выглядят как маленькие фабрики, которые производят конкретные реализации строк или массивов на основе предоставленных параметров (stringWith string , string ByAppendingString ). По сути, это очень похоже на заводской метод с параметрами, продемонстрированными в книге Design Patterns . Есть лучший способ сделать это? Должен ли я создавать интерфейсы, которые смешивают эти методы класса и методы экземпляра, или создавать только объекты Factory, у которых нет методов экземпляра? Я в замешательстве.

Ответы [ 4 ]

4 голосов
/ 25 сентября 2011

Хотя Apple заявляет , что эти методы являются фабричными, я утверждаю, что они не совпадают с шаблоном фабричного метода в Шаблоны проектирования . В шаблоне DP Factory Method используется абстрактный класс Creator с конкретными подклассами, которые генерируют конкретные Product классы. Методы, которые вы описываете (которые часто называют «удобными конструкторами»), почти никогда не реализуются таким образом. Apple определяет метод фабрики как «метод класса, который для удобства клиентов создает экземпляр класса. Метод фабрики объединяет выделение и инициализацию за один шаг и возвращает автоматически выпущенный экземпляр класса». Вот почему я считаю, что термин «конструктор удобства» является более подходящим и менее запутанным, чем «фабричный метод».

NSString - это кластер класса , который имеет некоторые сходные черты с шаблоном Factory Method, в котором вы можете получать разные конкретные классы из одного и того же вызова метода. Но кластеры классов отличаются от Factory Method тем, что суперкласс знает обо всех подклассах, и именно с суперклассом взаимодействуют вызывающие. В шаблоне Factory Method вызывающие абоненты взаимодействуют с подклассами класса Creator.

Итак, к вашему вопросу: вы должны создавать удобные методы, когда это удобно для вызывающей стороны. Дополняет:

Foo *foo = [[[Foo alloc] initWithSomething:something] autorelease];

с

Foo *foo = [Foo fooWithSomething:something];

По моему опыту, в 90% случаев вам этого не следует. Это не стоит дополнительного кода. Вам следует подождать, пока вы не увидите, что initWithSomething: называется лотом с autorelease сразу после него, а затем вы добавляете вспомогательный конструктор, чтобы сделать вещи более удобными. Вещи как stringWith... находятся в этом классе. Их много называют.

0 голосов
/ 25 сентября 2011

Класс в Objective-C также является объектами (Class Objects), шаблон проектирования фабричного класса является частью языка.

0 голосов
/ 25 сентября 2011

Эти методы обычно описываются в документации как удобные методы - написание [NSString stringWithString:s] просто короче, чем написание [[[NSString alloc] initWithString:s] autorelease], но они делают то же самое.

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

0 голосов
/ 25 сентября 2011

По определению, фабричный метод должен быть методом класса, потому что вам нужен класс для генерации нового экземпляра. Каркасы Apple используют сочетание фабричных методов (например, arrayWithObjects) и не фабричной инициализации (initWithObjects).

Кроме этого, я не совсем уверен, что понимаю ваш вопрос. Для большинства нетривиальных классов у вас будут как методы фабрики классов, так и методы инициализации экземпляра.

...