Методы фабрики классов

Методы фабрики классов реализованы классом как удобство для клиентов. Они комбинируют выделение и инициализацию за один шаг и возвращают созданный объект. Однако клиенту, получающему этот объект, не принадлежит объект, и таким образом (на политику монопольного использования объекта) не ответственно за выпуск его. Эти методы имеют форму + (ввести)имя класса... (где имя класса исключает любой префикс).

Какао обеспечивает много примеров, особенно среди классов «значения». 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;
}