Методы фабрики классов
Методы фабрики классов реализованы классом как удобство для клиентов. Они комбинируют выделение и инициализацию за один шаг и возвращают созданный объект. Однако клиенту, получающему этот объект, не принадлежит объект, и таким образом (на политику монопольного использования объекта) не ответственно за выпуск его. Эти методы имеют форму + (
ввести)
имя класса...
(где имя класса исключает любой префикс).
Какао обеспечивает много примеров, особенно среди классов «значения». NSDate
включает следующие методы фабрики классов:
+ (id)dateWithTimeIntervalSinceNow:(NSTimeInterval)secs; |
+ (id)dateWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secs; |
+ (id)dateWithTimeIntervalSince1970:(NSTimeInterval)secs; |
И NSData
предложения следующие методы фабрики:
+ (id)dataWithBytes:(const void *)bytes length:(unsigned)length; |
+ (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length; |
+ (id)dataWithBytesNoCopy:(void *)bytes length:(unsigned)length |
freeWhenDone:(BOOL)b; |
+ (id)dataWithContentsOfFile:(NSString *)path; |
+ (id)dataWithContentsOfURL:(NSURL *)url; |
+ (id)dataWithContentsOfMappedFile:(NSString *)path; |
Методы фабрики могут быть больше, чем простое удобство. Они могут не только объединить выделение и инициализацию, но выделение может сообщить инициализации. Как пример, скажем, необходимо инициализировать объект коллекции от файла списка свойств, кодирующего любое число элементов для набора (NSString
объекты, NSData
объекты, NSNumber
объекты, и т.д.). Прежде чем метод фабрики может знать, сколько памяти для выделения для набора он должен считать файл и проанализировать список свойств для определения сколько элементов, там и каковы тип объекта эти элементы.
Другая цель для метода фабрики классов состоит в том, чтобы гарантировать что определенный класс (NSWorkspace
, например), продает одноэлементный экземпляр. Несмотря на то, что init...
метод мог проверить, что только один экземпляр существует в любой момент в программе, это потребовало бы, чтобы предшествующее выделение «необработанного» экземпляра и затем, в управляемом коде памяти, должно было выпустить тот экземпляр. Метод фабрики, с другой стороны, дает Вам способ избежать вслепую выделять память для объекта, который Вы не могли бы использовать, как в следующем примере:
static AccountManager *DefaultManager = nil; |
+ (AccountManager *)defaultManager { |
if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; |
return DefaultManager; |
} |