JAVA-1597 Abstract Factory pattern example (#14733)

Upgraded example displaying a more complex use of the pattern
This commit is contained in:
Anastasios Ioannidis 2023-09-08 14:51:15 +03:00 committed by GitHub
parent b4d796004d
commit 28d4771dfd
10 changed files with 135 additions and 0 deletions

View File

@ -0,0 +1,8 @@
package com.baeldung.creational.abstractfactory2;
public class AbstractFactoryRunner {
public static void main(String[] args) {
new AnimalAbstractFactory().createAnimal(AnimalType.LAND);
}
}

View File

@ -0,0 +1,13 @@
package com.baeldung.creational.abstractfactory2;
public abstract class Animal {
AnimalType type;
AnimalEra era;
String name;
Animal(AnimalType type, AnimalEra era, String name) {
this.type = type;
this.era = era;
this.name = name;
}
abstract void create();
}

View File

@ -0,0 +1,22 @@
package com.baeldung.creational.abstractfactory2;
public class AnimalAbstractFactory {
Animal animal;
Animal createAnimal(AnimalType type) {
AnimalEra era = getFromConfiguration();
switch (era) {
case MESOZOIC:
animal = new MesozoicAnimalFactory().createAnimal(type);
break;
case CENOZOIC:
animal = new CenozoicAnimalFactory().createAnimal(type);
break;
}
return null;
}
AnimalEra getFromConfiguration() {
return AnimalEra.MESOZOIC;
}
}

View File

@ -0,0 +1,6 @@
package com.baeldung.creational.abstractfactory2;
public enum AnimalEra {
MESOZOIC,
CENOZOIC
}

View File

@ -0,0 +1,6 @@
package com.baeldung.creational.abstractfactory2;
public enum AnimalType {
LAND,
SKY
}

View File

@ -0,0 +1,23 @@
package com.baeldung.creational.abstractfactory2;
public class CenozoicAnimalFactory implements EraAnimalFactory{
@Override
public LandAnimal makeLandAnimal() {
return new LandAnimal(AnimalEra.CENOZOIC, "Mammoth");
}
@Override
public SkyAnimal makeSkyAnimal() {
return new SkyAnimal(AnimalEra.CENOZOIC, "Terror bird");
}
Animal createAnimal(AnimalType type) {
switch (type) {
case LAND:
return makeLandAnimal();
case SKY:
return makeSkyAnimal();
}
return null;
}
}

View File

@ -0,0 +1,7 @@
package com.baeldung.creational.abstractfactory2;
public interface EraAnimalFactory {
LandAnimal makeLandAnimal();
SkyAnimal makeSkyAnimal();
}

View File

@ -0,0 +1,13 @@
package com.baeldung.creational.abstractfactory2;
public class LandAnimal extends Animal{
LandAnimal(AnimalEra era, String name) {
super(AnimalType.LAND, era, name);
create();
}
@Override
void create() {
System.out.println("Creating a " + type + " animal: " + name);
}
}

View File

@ -0,0 +1,24 @@
package com.baeldung.creational.abstractfactory2;
public class MesozoicAnimalFactory implements EraAnimalFactory{
@Override
public LandAnimal makeLandAnimal() {
return new LandAnimal(AnimalEra.MESOZOIC, "Tyrannosaurus Rex");
}
@Override
public SkyAnimal makeSkyAnimal() {
return new SkyAnimal(AnimalEra.MESOZOIC, "Pterodactylus");
}
Animal createAnimal(AnimalType type) {
switch (type) {
case LAND:
return makeLandAnimal();
case SKY:
return makeSkyAnimal();
}
return null;
}
}

View File

@ -0,0 +1,13 @@
package com.baeldung.creational.abstractfactory2;
public class SkyAnimal extends Animal{
SkyAnimal(AnimalEra era, String name) {
super(AnimalType.SKY, era, name);
create();
}
@Override
void create() {
System.out.println("Creating a " + type + " animal: " + name);
}
}