Abstract factory (Abstraktní továrna) je návrhový vzor, jehož jádrem je specifikace tovární třídy. Konkrétní implementace továrny je dosazena až za běhu programu, díky čemuž mohou být v programu vytvářeny výkonné objekty šité na míru dané situaci.
Obvyklou demonstrací tohoto vzoru je grafické uživatelské rozhraní. Grafické rozhraní má vypadat (a často i fungovat) na různých operačních systémech odlišně. Z tohoto důvodu je zapotřebí při startu aplikace zjistit, na jakém operačním systému se aplikace aktuálně nachází a inicializovat příslušnou továrnu, která bude aplikaci zásobovat implementacemi uživatelského rozhraní pro daný systém.
Příklad
Dalším častým užitím tohoto vzoru je přístup do databáze. Mějme aplikaci, která může přistupovat jak do relační, tak do XML databáze na základě uživatelské volby. Jádrem je již zmíněná specifikace továrny, ze které dědí konkrétní tovární třídy pro relační a XML persistenci. Při startu programu dojde k volbě jedné z těchto implementací a ta pak zásobuje aplikaci výkonnými DAO objekty (data access object). Pro úplnost ještě zmiňme, že v kódu je k výkonným objektům přistupováno pomocí společného interfacu (v jazycích, které neznají interface pomocí společného abstraktního předka definujícího příslušné metody).
Kód
01.
/**
02.
* Operace, ktere musi splnovat vsechny tovarny
03.
* @author Pavel Micka
04.
*/
05.
interface
DAOFactoryInterface{
06.
public
DataAccessObjectInterface getDataAccessObject();
07.
}
08.
/**
09.
* Tovarna na XML data access objecty
10.
* @author Pavel Micka
11.
*/
12.
class
XmlDAOFactory
implements
DAOFactoryInterface{
13.
public
DataAccessObjectInterface getDataAccessObject() {
14.
return
new
XmlDataAccessObject();
15.
}
16.
}
17.
/**
18.
* Tovarna na relacni data access objecty
19.
* @author Pavel Micka
20.
*/
21.
class
RelationalDAOFactory
implements
DAOFactoryInterface{
22.
public
DataAccessObjectInterface getDataAccessObject() {
23.
return
new
RelationalDataAccessObject();
24.
}
25.
}
26.
/**
27.
* Operace, ktere musi splnovat vsechny DAO objekty
28.
* @author Pavel Micka
29.
*/
30.
interface
DataAccessObjectInterface{
31.
public
void
getData();
32.
}
33.
/**
34.
* Provadi operace nad XML databazi
35.
* @author Pavel Micka
36.
*/
37.
class
XmlDataAccessObject
implements
DataAccessObjectInterface{
38.
public
void
getData() {
39.
System.out.println(
"Delam operace v XML databazi"
);
40.
}
41.
}
42.
/**
43.
* Provadi operace nad relacni databazi
44.
* @author Pavel Micka
45.
*/
46.
class
RelationalDataAccessObject
implements
DataAccessObjectInterface{
47.
public
void
getData() {
48.
System.out.println(
"Delam operace v relacni databazi"
);
49.
}
50.
}