Descrizione dei design pattern Factory method, Abstract factory.
Factory method
Il design pattern Factory method è un design pattern creazionale.
Definisce un'interfaccia per la creazione di oggetti, delegando alle sottoclassi il compito di decidere quale tipo di oggetto istanziare.
Problema e soluzione
- Il client non dovrebbe conoscere i tipi esatte e le dipendenze necessarie per svolgere operazioni che non gli competono
- Possibilità di aggiungere componenti in maniera trasparente
- Controllo centralizzato della creazione degli oggetti
- Delegare la creazione degli oggetti ad un apposito factory method che può essere sovrascritto dalle sottoclassi
- Possibilità di aggiungere in qualsiasi momento sottoclassi specializzate
- La classe factory si può occupare di contare le risorse create e riallocarle
UML
Loading diagram...
Codice
// ConcreteCreator
public class ConcreteNumberCreator extends NumberCreator {
@Override
public Product factoryMethod(int number) {
if ((number & 1) == 0)
return new EvenNumber();
else
return new OddNumber();
}
}
// ConcreteProductA
public class OddNumber implements Number {
@Override
public boolean isEven() { return false; }
}
// ConcreteProductB
public class EvenNumber implements Number {
@Override
public boolean isEven() { return true; }
}
Possibili applicazioni
- Creazione di elementi di UI con stili differenti
- Leggere da sorgenti diverse
Pro e contro
- Nasconde la specializzazione di un interfaccia
- Permette di gestire in maniera centralizzata la creazione di oggetti
- Possibilità di aggiungere in qualsiasi momento sottoclassi senza complicare il client
- Gerarchia di classi più complessa
Abstract factory
Il design pattern Abstract factory è un design pattern creazionale.
Definisce un’interfaccia per creare famiglie di oggetti che hanno qualche relazione senza specificare le loro classi concrete.
Problema e soluzione
- Il client deve essere indipendente dalle classi utilizzate
- Creazione di una serie di oggetti in maniera consistente
- Lasciare che il factory si occupi di creare oggetti della stessa famiglia
- Le sottoclassi del factory si specializzano in una famiglia specifica
UML
Loading diagram...
Codice Product
// ConcreteProductA1
public class CircleMinimize implements Shape {
@Override
public String draw() { return "(_)" }
}
// ConcreteProductA2
public class CircleClose implements Shape {
@Override
public String draw() { return "(X)" }
}
// ConcreteProductB1
public class SquareMinimize implements Shape {
@Override
public String draw() { return "[_]" }
}
// ConcreteProductB2
public class SquareClose implements Shape {
@Override
public String draw() { return "[X]" }
}
Codice factory
// ConcreteFactoryA
public class CircleCreator implements Creator {
@Override
public Shape getMinimize() { return new CircleMinimize(); }
@Override
public Shape getClose() { return new CircleClose(); }
}
// ConcreteFactoryB
public class SquareCreator implements Creator {
@Override
public Shape getMinimize() { return new SquareMinimize(); }
@Override
public Shape getClose() { return new SquareClose(); }
}
Possibili applicazioni
- Creazione di elementi di UI con stili differenti
- Sistemi di internazionalizzazione
Pro e contro
- Certezza di produrre prodotti coerenti fra di loro
- La creazione degli oggetti è centralizzata
- Possibilità di aggiungere in qualsiasi momento sottoclassi senza complicare il client
- Gerarchia di classi più complessa
Challenge
- (Factory method) Gestione di più figure geometriche in base al numero di lati e/o angoli
- (Abstract factory) Supportare un menù multilingua con un apposito AbstractFactory