diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/Category.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/Category.java new file mode 100644 index 0000000..a29803e --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/Category.java @@ -0,0 +1,18 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.stat.method; + +import java.util.HashMap; +import java.util.Map; + +class Category { + private static final Map CACHE = new HashMap<>(); + + private final String name; + + private Category(String name) { + this.name = name; + } + + static Category of(String name) { + return CACHE.computeIfAbsent(name.toLowerCase(), Category::new); + } +} \ No newline at end of file diff --git a/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/Pair.java b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/Pair.java new file mode 100644 index 0000000..f395007 --- /dev/null +++ b/DesignPatterns/src/main/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/Pair.java @@ -0,0 +1,28 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.stat.method; + +import java.util.Map; + +record Pair(L left, R right) { + + private static final Pair EMPTY = new Pair<>(null, null); + + static Pair of(L left, R right) { + return new Pair<>(left, right); + } + + static Pair empty() { + return EMPTY; + } + + static Pair left(L left) { + return of(left, null); + } + + static Pair right(R right) { + return of(null, right); + } + + static Pair fromMapEntry(Map.Entry mapEntry) { + return of(mapEntry.getKey(), mapEntry.getValue()); + } +} diff --git a/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/StaticFactoryMethodTest.java b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/StaticFactoryMethodTest.java new file mode 100644 index 0000000..8a7d1e5 --- /dev/null +++ b/DesignPatterns/src/test/java/pl/mperor/lab/java/design/pattern/creational/factory/stat/method/StaticFactoryMethodTest.java @@ -0,0 +1,35 @@ +package pl.mperor.lab.java.design.pattern.creational.factory.stat.method; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +public class StaticFactoryMethodTest { + + @Test + public void testClearNaming() { + Assertions.assertEquals(new Pair<>("one", "two"), Pair.of("one", "two")); + + Assertions.assertNull(Pair.empty().left()); + Assertions.assertNull(Pair.empty().right()); + + var onlyLeft = Pair.left("Only left"); + Assertions.assertNotNull(onlyLeft.left()); + Assertions.assertNull(onlyLeft.right()); + } + + @Test + public void testTypeConversion() { + var entry = Map.entry(1, 2); + var pair = Pair.fromMapEntry(entry); + Assertions.assertEquals(pair.left(), entry.getKey()); + Assertions.assertEquals(pair.right(), entry.getValue()); + } + + @Test + public void testOptimizedObjectReuseAkaCaching() { + Assertions.assertSame(Pair.empty(), Pair.empty()); + Assertions.assertSame(Category.of("Knowledge"), Category.of("Knowledge")); + } +} \ No newline at end of file