diff --git a/factory/src/main/java/com/iluwatar/factory/App.java b/factory/src/main/java/com/iluwatar/factory/App.java index ce9f205b0f15..d1fe7f115cd1 100644 --- a/factory/src/main/java/com/iluwatar/factory/App.java +++ b/factory/src/main/java/com/iluwatar/factory/App.java @@ -40,8 +40,8 @@ public class App { /** Program main entry point. */ public static void main(String[] args) { LOGGER.info("The alchemist begins his work."); - var coin1 = CoinFactory.getCoin(CoinType.COPPER); - var coin2 = CoinFactory.getCoin(CoinType.GOLD); + var coin1 = CoinType.COPPER.getInstance(); + var coin2 = CoinType.GOLD.getInstance(); LOGGER.info(coin1.getDescription()); LOGGER.info(coin2.getDescription()); } diff --git a/factory/src/main/java/com/iluwatar/factory/CoinType.java b/factory/src/main/java/com/iluwatar/factory/CoinType.java index de1583bf9099..31eb6a3aead8 100644 --- a/factory/src/main/java/com/iluwatar/factory/CoinType.java +++ b/factory/src/main/java/com/iluwatar/factory/CoinType.java @@ -25,6 +25,7 @@ package com.iluwatar.factory; import java.util.function.Supplier; +import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -36,4 +37,15 @@ public enum CoinType { GOLD(GoldCoin::new); private final Supplier constructor; + + @Getter(AccessLevel.NONE) + private Coin instance; + + /** Returns singleton instance of this coin type. */ + public Coin getInstance() { + if (instance == null) { + instance = constructor.get(); + } + return instance; + } } diff --git a/factory/src/test/java/com/iluwatar/factory/CoinFactoryTest.java b/factory/src/test/java/com/iluwatar/factory/CoinFactoryTest.java index f7cf7799e8b6..212a07353cd8 100644 --- a/factory/src/test/java/com/iluwatar/factory/CoinFactoryTest.java +++ b/factory/src/test/java/com/iluwatar/factory/CoinFactoryTest.java @@ -30,9 +30,21 @@ class CoinFactoryTest { + @Test + void shouldReturnCopperCoinInstance() { + final var copperCoin = CoinType.COPPER.getInstance(); + assertTrue(copperCoin instanceof CopperCoin); + } + @Test void shouldReturnGoldCoinInstance() { - final var goldCoin = CoinFactory.getCoin(CoinType.GOLD); + final var goldCoin = CoinType.GOLD.getInstance(); assertTrue(goldCoin instanceof GoldCoin); } + + @Test + void shouldReturnSameInstanceEachTime() { + assertSame(CoinType.GOLD.getInstance(), CoinType.GOLD.getInstance()); + assertSame(CoinType.COPPER.getInstance(), CoinType.COPPER.getInstance()); + } }