Gremo
24-09-2007, 07:52
ciao a tutti,
leggendo qua e la il factory method (in particolare questo link (http://www.ugolandini.net/FactoryMethodPattern.html)) mi sorge un dubbio sulla sua utilità.
In particolare, riporto parte della definizione del pattern:
La classe Creator deve in qualche modo creare un oggetto di classe Product, ed utilizzarlo nei suoi metodi. Nel diagramma, il metodo anOperation() ha bisogno di lavorare su un'istanza di Product: ma come farlo, visto che questa ultima è astratta? La classe Creator deve sì lavorare sull'interfaccia comune Product, ma nella realtà verranno creati dei ConcreteProduct specifici, che però non possono essere conosciuti a priori, visto che queste classi probabilmente ancora neanche esistono.
Quindi creator deve lavorare su ConcreteProduct che di fatto non esistono ancora. il metodo anOperation() ha bisogno di lavorare su un'istanza di Product:
...
Product p = this.factoryMethod();
p.doSomething1();
p.doSomething2();
...
Il factory method (di un ConcreteCreator) restituisce un'istanza della sottoclasse di product, quindi possiamo lavorare su un ConcreteProduct "magicamente".
Il problema è, con l'assegnazione Product p = this.factoryMethod(), il mio oggetto avrà solo le proprietà e i membri dell'interfaccia Product (se non si effettua un cast specifico), ma nessuna proprietà/metodo aggiunto da una sottoclassse di Product. Ovviamente.
Allora che senso ha tutto il pattern? Sarabbe stato possibile definire anOperation() in una classe qualsiasi, con un oggetto di tipo Product passato come argomento, e lavorando su questa interfaccia.
No?!
leggendo qua e la il factory method (in particolare questo link (http://www.ugolandini.net/FactoryMethodPattern.html)) mi sorge un dubbio sulla sua utilità.
In particolare, riporto parte della definizione del pattern:
La classe Creator deve in qualche modo creare un oggetto di classe Product, ed utilizzarlo nei suoi metodi. Nel diagramma, il metodo anOperation() ha bisogno di lavorare su un'istanza di Product: ma come farlo, visto che questa ultima è astratta? La classe Creator deve sì lavorare sull'interfaccia comune Product, ma nella realtà verranno creati dei ConcreteProduct specifici, che però non possono essere conosciuti a priori, visto che queste classi probabilmente ancora neanche esistono.
Quindi creator deve lavorare su ConcreteProduct che di fatto non esistono ancora. il metodo anOperation() ha bisogno di lavorare su un'istanza di Product:
...
Product p = this.factoryMethod();
p.doSomething1();
p.doSomething2();
...
Il factory method (di un ConcreteCreator) restituisce un'istanza della sottoclasse di product, quindi possiamo lavorare su un ConcreteProduct "magicamente".
Il problema è, con l'assegnazione Product p = this.factoryMethod(), il mio oggetto avrà solo le proprietà e i membri dell'interfaccia Product (se non si effettua un cast specifico), ma nessuna proprietà/metodo aggiunto da una sottoclassse di Product. Ovviamente.
Allora che senso ha tutto il pattern? Sarabbe stato possibile definire anOperation() in una classe qualsiasi, con un oggetto di tipo Product passato come argomento, e lavorando su questa interfaccia.
No?!