From e02964ff81fed148941cecc84c1efa6d1a75fc34 Mon Sep 17 00:00:00 2001 From: Anastasios Ioannidis <121166333+anastasiosioannidis@users.noreply.github.com> Date: Fri, 8 Sep 2023 14:51:15 +0300 Subject: [PATCH] JAVA-1597 Abstract Factory pattern example (#14733) Upgraded example displaying a more complex use of the pattern --- .../AbstractFactoryRunner.java | 8 +++++++ .../creational/abstractfactory2/Animal.java | 13 ++++++++++ .../AnimalAbstractFactory.java | 22 +++++++++++++++++ .../abstractfactory2/AnimalEra.java | 6 +++++ .../abstractfactory2/AnimalType.java | 6 +++++ .../CenozoicAnimalFactory.java | 23 ++++++++++++++++++ .../abstractfactory2/EraAnimalFactory.java | 7 ++++++ .../abstractfactory2/LandAnimal.java | 13 ++++++++++ .../MesozoicAnimalFactory.java | 24 +++++++++++++++++++ .../abstractfactory2/SkyAnimal.java | 13 ++++++++++ 10 files changed, 135 insertions(+) create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AbstractFactoryRunner.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/Animal.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalAbstractFactory.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalEra.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalType.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/CenozoicAnimalFactory.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/EraAnimalFactory.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/LandAnimal.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/MesozoicAnimalFactory.java create mode 100644 patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/SkyAnimal.java diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AbstractFactoryRunner.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AbstractFactoryRunner.java new file mode 100644 index 0000000000..59aa3f8040 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AbstractFactoryRunner.java @@ -0,0 +1,8 @@ +package com.baeldung.creational.abstractfactory2; + +public class AbstractFactoryRunner { + + public static void main(String[] args) { + new AnimalAbstractFactory().createAnimal(AnimalType.LAND); + } +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/Animal.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/Animal.java new file mode 100644 index 0000000000..97b444c3e0 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/Animal.java @@ -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(); +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalAbstractFactory.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalAbstractFactory.java new file mode 100644 index 0000000000..6d09e1661a --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalAbstractFactory.java @@ -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; + } +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalEra.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalEra.java new file mode 100644 index 0000000000..0ee4deda65 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalEra.java @@ -0,0 +1,6 @@ +package com.baeldung.creational.abstractfactory2; + +public enum AnimalEra { + MESOZOIC, + CENOZOIC +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalType.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalType.java new file mode 100644 index 0000000000..be2f5e2361 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/AnimalType.java @@ -0,0 +1,6 @@ +package com.baeldung.creational.abstractfactory2; + +public enum AnimalType { + LAND, + SKY +} \ No newline at end of file diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/CenozoicAnimalFactory.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/CenozoicAnimalFactory.java new file mode 100644 index 0000000000..cf28acdd25 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/CenozoicAnimalFactory.java @@ -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; + } +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/EraAnimalFactory.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/EraAnimalFactory.java new file mode 100644 index 0000000000..30c69b4598 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/EraAnimalFactory.java @@ -0,0 +1,7 @@ +package com.baeldung.creational.abstractfactory2; + +public interface EraAnimalFactory { + + LandAnimal makeLandAnimal(); + SkyAnimal makeSkyAnimal(); +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/LandAnimal.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/LandAnimal.java new file mode 100644 index 0000000000..963cd96969 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/LandAnimal.java @@ -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); + } +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/MesozoicAnimalFactory.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/MesozoicAnimalFactory.java new file mode 100644 index 0000000000..dd56669242 --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/MesozoicAnimalFactory.java @@ -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; + } + +} diff --git a/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/SkyAnimal.java b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/SkyAnimal.java new file mode 100644 index 0000000000..ce27236d7c --- /dev/null +++ b/patterns-modules/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory2/SkyAnimal.java @@ -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); + } +}