Stile Objective-C: implemento metodi factory o metodi init?

6

Sono nuovo nella programmazione Objective-C e sto creando varie classi per un'applicazione iOS su cui sto lavorando.

Durante la creazione di oggetti, sembra che molte classi nei framework incorporati utilizzino il modello "metodo factory statico", in questo modo:

MyObject* m = [MyObject objectWithName:@"foo" id:@7 description:@"bar"];

tuttavia, molte classi hanno anche delle sostituzioni su init , come questa:

MyObject* m = [[MyObject alloc] initWithName:@"foo" id:@7 description:@"bar"];

Posso vedere che se voglio coprire tutte le mie basi, implementerei entrambe e ho il metodo objectWithName... chiamata initWithName... , tuttavia questo sembra piuttosto noioso.

Mi stavo chiedendo - esiste uno stile o una guida da seguire quando dovrei implementare lo schema del metodo di fabbrica rispetto a un sovraccarico di init ? Ho cercato su google per questo, ma non sono riuscito a trovare nulla (molto probabilmente perché i termini sono abbastanza generici e Google non li ricerca bene)

Qualunque consiglio o opinione sarebbe molto apprezzato

    
posta Orion Edwards 28.04.2014 - 01:58
fonte

2 risposte

2

Da link :

Factory methods can be more than a simple convenience. They can not only combine allocation and initialization, but the allocation can inform the initialization. As an example, let’s say you must initialize a collection object from a property-list file that encodes any number of elements for the collection (NSString objects, NSData objects, NSNumber objects, and so on). Before the factory method can know how much memory to allocate for the collection, it must read the file and parse the property list to determine how many elements there are and what object type these elements are.

Another purpose for a class factory method is to ensure that a certain class (NSWorkspace, for example) vends a singleton instance. Although an init... method could verify that only one instance exists at any one time in a program, it would require the prior allocation of a “raw” instance and then, in memory-managed code, would have to release that instance. A factory method, on the other hand, gives you a way to avoid blindly allocating memory for an object that you might not use.

    
risposta data 28.04.2014 - 02:33
fonte
2

I was wondering - is there any style or guidance from around when I should implement the factory method pattern vs an init overload?

Ogni classe dovrebbe avere un inizializzatore designato, cioè un metodo di istanza il cui nome inizia con "init" che lascia un oggetto appena assegnato in uno stato valido. È possibile aggiungere altri inizializzatori che forniscono funzionalità aggiuntive, ma questi dovrebbero chiamare l'inizializzatore designato. Puoi anche creare metodi di fabbrica quando è utile.

Questa è la linea guida:

  • sempre fornisce un inizializzatore designato
  • fornisci inizializzatori e metodi di produzione aggiuntivi se ne hai bisogno o li vuoi
risposta data 28.04.2014 - 03:13
fonte

Leggi altre domande sui tag