File tree Expand file tree Collapse file tree 10 files changed +125
-6
lines changed
main/java/pl/mperor/lab/java/design/pattern/creational/factory
test/java/pl/mperor/lab/java/design/pattern/creational/factory/abs Expand file tree Collapse file tree 10 files changed +125
-6
lines changed Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ public class AppStarter {
4+
5+ public static void startup (Profile profile ) {
6+ StarterFactory starter = switch (profile ) {
7+ case PROD -> new ProdStarterFactory ();
8+ case DEV -> new DevStarterFactory ();
9+ };
10+
11+ starter .getDatabaseConnection ().connect ();
12+ starter .getLoggingService ().init ();
13+ starter .getSecurityPolicy ().applyPolicy ();
14+ }
15+
16+ public enum Profile {
17+ PROD ,
18+ DEV ;
19+ }
20+ }
Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ public interface DatabaseConnection {
4+ void connect ();
5+ }
Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ public class DevStarterFactory implements StarterFactory {
4+
5+ @ Override
6+ public DatabaseConnection getDatabaseConnection () {
7+ return () -> System .out .println ("Connecting to in-memory H2 database 🗄️." );
8+ }
9+
10+ @ Override
11+ public LoggingService getLoggingService () {
12+ return () -> System .out .println ("Using DEV 🟩 logging service." );
13+ }
14+
15+ @ Override
16+ public SecurityPolicy getSecurityPolicy () {
17+ return () -> System .out .println ("🔓 Applying no security." );
18+ }
19+ }
Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ public interface LoggingService {
4+ void init ();
5+ }
Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ public class ProdStarterFactory implements StarterFactory {
4+
5+ @ Override
6+ public DatabaseConnection getDatabaseConnection () {
7+ return () -> System .out .println ("Connecting to PostgreSQL database 🗄️." );
8+ }
9+
10+ @ Override
11+ public LoggingService getLoggingService () {
12+ return () -> System .out .println ("Using PROD 🟥 logging service." );
13+ }
14+
15+ @ Override
16+ public SecurityPolicy getSecurityPolicy () {
17+ return () -> System .out .println ("🔒 Applying strict security policies." );
18+ }
19+ }
Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ public interface SecurityPolicy {
4+ void applyPolicy ();
5+ }
Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ public interface StarterFactory {
4+
5+ DatabaseConnection getDatabaseConnection ();
6+
7+ LoggingService getLoggingService ();
8+
9+ SecurityPolicy getSecurityPolicy ();
10+ }
Original file line number Diff line number Diff line change @@ -12,9 +12,9 @@ public Animal getNewInstance(AnimalType type) {
1212 }
1313
1414 public enum AnimalType {
15- DOG (() -> new Dog () ),
16- CAT (() -> new Cat () ),
17- FLY (() -> new Fly () );
15+ DOG (Dog :: new ),
16+ CAT (Cat :: new ),
17+ FLY (Fly :: new );
1818
1919 private final Supplier <Animal > creator ;
2020
Original file line number Diff line number Diff line change @@ -9,9 +9,9 @@ public class AnimalFactoryMapImpl implements AnimalFactory<String> {
99 private final Map <String , Supplier <Animal >> nameToCreator = new HashMap <>();
1010
1111 public AnimalFactoryMapImpl () {
12- nameToCreator .put (Fly .NAME , () -> new Fly () );
13- nameToCreator .put (Dog .NAME , () -> new Dog () );
14- nameToCreator .put (Cat .NAME , () -> new Cat () );
12+ nameToCreator .put (Fly .NAME , Fly :: new );
13+ nameToCreator .put (Dog .NAME , Dog :: new );
14+ nameToCreator .put (Cat .NAME , Cat :: new );
1515 }
1616
1717 public Animal getNewInstance (String type ) {
Original file line number Diff line number Diff line change 1+ package pl .mperor .lab .java .design .pattern .creational .factory .abs ;
2+
3+ import org .junit .jupiter .api .Assertions ;
4+ import org .junit .jupiter .api .Test ;
5+ import pl .mperor .lab .common .TestUtils ;
6+
7+ import java .util .stream .Stream ;
8+
9+ public class AppStarterAbstractFactoryTest {
10+
11+ @ Test
12+ public void shouldAllowToCreateAppStarterForConcreteProfile () {
13+ var out = TestUtils .setTempSystemOut ();
14+
15+ AppStarter .startup (AppStarter .Profile .DEV );
16+ Assertions .assertLinesMatch (
17+ Stream .of (
18+ "Connecting to in-memory H2 database 🗄️." ,
19+ "Using DEV 🟩 logging service." ,
20+ "🔓 Applying no security."
21+ ), out .all ().lines ()
22+ );
23+
24+ AppStarter .startup (AppStarter .Profile .PROD );
25+ Assertions .assertLinesMatch (
26+ Stream .of (
27+ "Connecting to PostgreSQL database 🗄️." ,
28+ "Using PROD 🟥 logging service." ,
29+ "🔒 Applying strict security policies."
30+ ), out .all ().lines ().skip (3 )
31+ );
32+
33+ TestUtils .resetSystemOut ();
34+ }
35+
36+ }
You can’t perform that action at this time.
0 commit comments