Fabrique abstraite (Jeu de stratégie en temps réel)

/*
* Exemple inspiré de Mathieu G (https://design-patterns.fr/fabrique-en-java)
*/

package abstract_factory;

import java.util.ArrayList;

enum TypeUnite {
SOLDAT,
COMMANDANT
}

public class AbstractFactory {

public static void main( String[] args ) {
Fabrique usineExtraterrestre = new FabriqueExtraterrestre();
Usine usine = new Usine(usineExtraterrestre);
Unite unite = usine.formerUnite(TypeUnite.SOLDAT);
System.out.println(unite);
}
}

final class Usine {

Fabrique _fabrique;

public Usine( Fabrique fabrique ) {
_fabrique = fabrique;
}

public Unite formerUnite( TypeUnite type ) {
Unite unite = creerUnite(type);
unite.consommerRessource();
unite.equiper();
return unite;
}

public Unite creerUnite( TypeUnite type ) {
return _fabrique.creerUnite(type);
}
}

final class FabriqueHumain extends Fabrique {

@Override
public Unite creerUnite( TypeUnite type ) {
return switch (type) {
case SOLDAT -> new SoldatHumain();
case COMMANDANT -> new CommandantHumain();
};
}
}

abstract class Fabrique {
public abstract Unite creerUnite( TypeUnite type );
}

class FabriqueExtraterrestre extends Fabrique {

@Override
public Unite creerUnite( TypeUnite type ) {
return switch (type) {
case SOLDAT -> new SoldatExtraterrestre();
case COMMANDANT -> new CommandantExtraterrestre();
};
}
}

abstract class Unite {
private final String _nom;
private final int _coutConstruction;
private final int _precisionAttaque;
private final int _esquiveDefense;
private final ArrayList<String> _equipements;

public Unite( String nom, int coutConstruction, int precisionAttaque, int esquiveDefense ) {
_nom = nom;
_coutConstruction = coutConstruction;
_precisionAttaque = precisionAttaque;
_esquiveDefense = esquiveDefense;
_equipements = new ArrayList<>();
}

public void ajouterEquipement( String value ) {
_equipements.add(value);
}

public void consommerRessource() {
System.out.println("la création de l'unité " + this.getClass().getSimpleName() + " consomme " + _coutConstruction + " ressources");
}

public abstract void equiper();

public String toString() {
StringBuilder str = new StringBuilder("Nom : " + _nom + "\n");
str.append("Coût de construction : ").append(_coutConstruction).append("\n");
str.append("Précision d'attaque : ").append(_precisionAttaque).append("\n");
str.append("Esquive en défense : ").append(_esquiveDefense).append("\n");
str.append("Equipements : ");
for (String equipement : _equipements) {
str.append(equipement).append(" ");
}
return str.toString();
}
}

class SoldatHumain extends Unite {
public SoldatHumain() {
super("Fantassin", 5, 1, 2);
}

public void equiper() {
ajouterEquipement("Pistoler");
ajouterEquipement("Bouclier");
System.out.println("Equipement d'un soldat humain (Pistoler, Bouclier).");
}
}

class CommandantHumain extends Unite {

public CommandantHumain() {
super("Lieutenant", 14, 5, 2);
}

public void equiper() {
ajouterEquipement("Uzi");
ajouterEquipement("Bouclier");
System.out.println("Equipement d'un commandant humain (Uzi, Bouclier).");
}
}

class CommandantExtraterrestre extends Unite {

public CommandantExtraterrestre() {
super("Prédateur", 10, 3, 3);
}

public void equiper() {
ajouterEquipement("Mitraillette à plasma");
ajouterEquipement("Peau");
System.out.println("Equipement d'un commandant extraterrestre (Mitraillette à plasma, Peau).");
}
}

class SoldatExtraterrestre extends Unite {

public SoldatExtraterrestre() {
super("Alien", 6, 2, 1);
}

public void equiper() {
ajouterEquipement("Acide");
ajouterEquipement("Peau");
System.out.println("Equipement d'un soldat extraterrestre (Acide, Peau).");
}
}
Last modified: Thursday, 17 September 2020, 10:16 AM