diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/AppStarter.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/AppStarter.java new file mode 100644 index 0000000..19b4762 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/AppStarter.java @@ -0,0 +1,20 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +public class AppStarter { + + public static void startup(Profile profile) { + StarterFactory starter = switch (profile) { + case PROD -> new ProdStarterFactory(); + case DEV -> new DevStarterFactory(); + }; + + starter.getDatabaseConnection().connect(); + starter.getLoggingService().init(); + starter.getSecurityPolicy().applyPolicy(); + } + + public enum Profile { + PROD, + DEV; + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/DatabaseConnection.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/DatabaseConnection.java new file mode 100644 index 0000000..8b515a6 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/DatabaseConnection.java @@ -0,0 +1,5 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +public interface DatabaseConnection { + void connect(); +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/DevStarterFactory.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/DevStarterFactory.java new file mode 100644 index 0000000..4cb762b --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/DevStarterFactory.java @@ -0,0 +1,19 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +public class DevStarterFactory implements StarterFactory { + + @Override + public DatabaseConnection getDatabaseConnection() { + return () -> System.out.println("Connecting to in-memory H2 database 🗄️."); + } + + @Override + public LoggingService getLoggingService() { + return () -> System.out.println("Using DEV 🟩 logging service."); + } + + @Override + public SecurityPolicy getSecurityPolicy() { + return () -> System.out.println("🔓 Applying no security."); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/LoggingService.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/LoggingService.java new file mode 100644 index 0000000..ec07f4e --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/LoggingService.java @@ -0,0 +1,5 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +public interface LoggingService { + void init(); +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/ProdStarterFactory.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/ProdStarterFactory.java new file mode 100644 index 0000000..ba3a2c4 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/ProdStarterFactory.java @@ -0,0 +1,19 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +public class ProdStarterFactory implements StarterFactory { + + @Override + public DatabaseConnection getDatabaseConnection() { + return () -> System.out.println("Connecting to PostgreSQL database 🗄️."); + } + + @Override + public LoggingService getLoggingService() { + return () -> System.out.println("Using PROD 🟥 logging service."); + } + + @Override + public SecurityPolicy getSecurityPolicy() { + return () -> System.out.println("🔒 Applying strict security policies."); + } +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/SecurityPolicy.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/SecurityPolicy.java new file mode 100644 index 0000000..07befd0 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/SecurityPolicy.java @@ -0,0 +1,5 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +public interface SecurityPolicy { + void applyPolicy(); +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/StarterFactory.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/StarterFactory.java new file mode 100644 index 0000000..d76ee1c --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/StarterFactory.java @@ -0,0 +1,10 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +public interface StarterFactory { + + DatabaseConnection getDatabaseConnection(); + + LoggingService getLoggingService(); + + SecurityPolicy getSecurityPolicy(); +} diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryEnumImpl.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryEnumImpl.java index f7b7d7e..875f08d 100644 --- a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryEnumImpl.java +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryEnumImpl.java @@ -12,9 +12,9 @@ public Animal getNewInstance(AnimalType type) { } public enum AnimalType { - DOG(() -> new Dog()), - CAT(() -> new Cat()), - FLY(() -> new Fly()); + DOG(Dog::new), + CAT(Cat::new), + FLY(Fly::new); private final Supplier creator; diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryMapImpl.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryMapImpl.java index cb77995..b4b9cc0 100644 --- a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryMapImpl.java +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryMapImpl.java @@ -9,9 +9,9 @@ public class AnimalFactoryMapImpl implements AnimalFactory { private final Map> nameToCreator = new HashMap<>(); public AnimalFactoryMapImpl() { - nameToCreator.put(Fly.NAME, () -> new Fly()); - nameToCreator.put(Dog.NAME, () -> new Dog()); - nameToCreator.put(Cat.NAME, () -> new Cat()); + nameToCreator.put(Fly.NAME, Fly::new); + nameToCreator.put(Dog.NAME, Dog::new); + nameToCreator.put(Cat.NAME, Cat::new); } public Animal getNewInstance(String type) { diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/AppStarterAbstractFactoryTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/AppStarterAbstractFactoryTest.java new file mode 100644 index 0000000..1ab4a9d --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/factory/abs/AppStarterAbstractFactoryTest.java @@ -0,0 +1,36 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.abs; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import pl.mperor.lab.common.TestUtils; + +import java.util.stream.Stream; + +public class AppStarterAbstractFactoryTest { + + @Test + public void shouldAllowToCreateAppStarterForConcreteProfile() { + var out = TestUtils.setTempSystemOut(); + + AppStarter.startup(AppStarter.Profile.DEV); + Assertions.assertLinesMatch( + Stream.of( + "Connecting to in-memory H2 database 🗄️.", + "Using DEV 🟩 logging service.", + "🔓 Applying no security." + ), out.all().lines() + ); + + AppStarter.startup(AppStarter.Profile.PROD); + Assertions.assertLinesMatch( + Stream.of( + "Connecting to PostgreSQL database 🗄️.", + "Using PROD 🟥 logging service.", + "🔒 Applying strict security policies." + ), out.all().lines().skip(3) + ); + + TestUtils.resetSystemOut(); + } + +} \ No newline at end of file