La Fabrique (Factory) est un patron de conception de création qui permet de créer des produits sans avoir à préciser leurs classes concrètes.
La fabrique définit une méthode qui doit être utilisée pour créer des objets à la place de l’appel au constructeur (opérateur new). Les sous-classes peuvent redéfinir cette méthode pour modifier la classe des objets qui seront créés.
Un exemple d'implémentation, une fabrique de véhicule (voiture, vélo, etc.)
Prenons des classes de véhicules héritant d'une classe mère :
enum etypeVehicule{
eVoiture,
eVelo
}
// classe abstraite :
public abstract class Vehicule {
public Vehicule(){;}
public abstract void rouler();
}
// classes filles :
public class Voiture extends Vehicule {
public Voiture(){;}
public void rouler(){
System.out.println("je pollue");
}
}
public class Velo Vehicule {
public Velo(){;}
public void rouler(){
System.out.println("je ne pollue pas");
}
}
On pourrait imaginer le système suivant :
public class fabriqueSimple {
public fabriqueSimple(){;}
Vehicule creerVehicule(etypeVehicule type){
if (type == eVoiture)
return new Voiture;
if (type == eVelo)
return new Velo;
return null;
}
}
``` java
Le problème de cet exemple :
* On veut éviter le switch/case (série de if dans notre cas) qui peut être dangereuse (ça sent la copier-couiller…)
* On veut éviter de modifier cette classe à chaque nouvel objet.
Ou encore :
```java
public class fabriqueSimple {
public fabriqueSimple(){}
Voiture creerVoiture(){
return new Voiture;
}
Velo creerVelo(){
return new Veto;
}
}
Ce type fabrique est utilisée pour la construction d'objet avec par exemples des cas particuliers que l'on ne veut pas mettre dans la classe principale.
Et l'on peut imaginer d'autres fabriques, ayant des comportements différents :
public abstract class abstractFabrique {
public abstractFabrique(){;}
public abstract Voiture creerVoiture();
public abstract Voiture creerVelo();
}
public class fabriqueA extends abstractFabrique {
public fabriqueA(){;}
public abstract Voiture creerVoiture(){
//je créé des voitures à essence
}
public abstract Velo creerVelo(){
//je créé des vélos hollandais
}
}
public class fabriqueB extends abstractFabrique {
public fabriqueB(){;}
public abstract Voiture creerVoiture(){
//je créé des voitures électrique
}
public abstract Velo creerVelo(){
//je créé des vélos électrique
}
}