Skip to content

Commit e58681a

Browse files
authored
Add abstract factory implementation with test scenario (#48)
1 parent d0b1867 commit e58681a

File tree

10 files changed

+125
-6
lines changed

10 files changed

+125
-6
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package pl.mperor.lab.java.design.pattern.creational.factory.abs;
2+
3+
public interface DatabaseConnection {
4+
void connect();
5+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package pl.mperor.lab.java.design.pattern.creational.factory.abs;
2+
3+
public interface LoggingService {
4+
void init();
5+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package pl.mperor.lab.java.design.pattern.creational.factory.abs;
2+
3+
public interface SecurityPolicy {
4+
void applyPolicy();
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
}

DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryEnumImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff 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

DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/basic/AnimalFactoryMapImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff 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) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
}

0 commit comments

Comments
 (0)