Кластер класса
Кластер класса является архитектурой что группы много частных, конкретных подклассов под общественностью, абстрактным суперклассом. Группировка классов таким образом предоставляет упрощенный интерфейс пользователю, видящему только публично видимую архитектуру. Негласно, тем не менее, абстрактный класс звонит частному подклассу, самому подходящему для выполнения определенной задачи. Например, несколько из общих классов Какао реализованы как кластеры класса, включая NSArray
, NSString
, и NSDictionary
. Существует много путей, которыми они могут представлять свое внутреннее хранение данных. Для любого определенного экземпляра абстрактный класс выбирает самый эффективный класс для использования на основе данных, с которыми инициализируется экземпляр.
Вы создаете и взаимодействуете с экземплярами кластера так же, как Вы были бы любой другой класс. Негласно, тем не менее, при создании экземпляра общедоступного класса класс возвращает объект надлежащего подкласса на основе метода создания, который Вы вызываете. (Вы не делаете, и не может, выбрать фактический класс экземпляра.)
Взятие платформы Основы NSString
класс как пример, Вы могли создать три различных строковых объекта:
NSString *string1 = @"UTF32.txt"; |
NSString *string2 = [NSHomeDirectory() stringByAppendingPathComponent:string1]; |
NSTextStorage *storage = [[NSTextStorage alloc] initWithString:string2]; |
NSString *string3 = [storage string]; |
Каждая строка может быть экземпляром различного частного подкласса (и фактически, на OS X v10.5, каждый). Несмотря на то, что каждый из объектов имеет частный подкласс NSString
, удобно рассмотреть каждый из объектов быть экземплярами NSString
класс. Вы используете методы экземпляра, объявленные NSString
когда Вы были бы, если они были экземплярами NSString
самостоятельно.
Преимущества
Преимущество кластера класса является прежде всего эффективностью. Внутреннее представление данных, которыми управляет экземпляр, может быть адаптировано в соответствии со способом, которым это создается или быть используемым. Кроме того, код, который Вы пишете, будет продолжать работать, даже если изменится конкретная реализация.
Соображения
Кластерная архитектура класса включает компромисс между простотой и расширяемостью: Наличие нескольких общедоступных классов помогает для множества частных, упрощает изучать и использовать классы в платформе, но несколько тяжелее создавать подклассы в любом из кластеров.
Новый класс, который Вы создаете в кластере класса, должен:
Будьте подклассом абстрактного суперкласса кластера
Объявите его собственное хранение
Переопределите примитивные методы суперкласса
Если редко необходимо создать подкласс — как имеет место с кластерами класса в платформе Основы — тогда, кластерная архитектура ясно выгодна. Вы могли бы также быть в состоянии избежать разделять на подклассы при помощи состава; путем встраивания частного кластерного объекта в объект собственного проекта Вы создаете составной объект. Этот составной объект может полагаться на кластерный объект для своей основной функциональности, только прерывая сообщения, что это хочет обработать некоторым определенным способом. Используя этот подход сокращает объем кода, который Вы должны записать и позволяете Вам использовать в своих интересах протестированный код, предоставленный Платформой Основы.