From c87689b2472195a8911b51876aae1d9853558c67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Mon, 24 Jan 2022 18:28:44 +0200 Subject: [PATCH] task: Update Multiton example (#1950) Co-authored-by: Subhrodip Mohanta --- multiton/README.md | 71 +++++++++++++------ .../main/java/com/iluwatar/multiton/App.java | 8 ++- .../com/iluwatar/multiton/NazgulTest.java | 1 - 3 files changed, 53 insertions(+), 27 deletions(-) diff --git a/multiton/README.md b/multiton/README.md index f991c2924..6daaa4a9b 100644 --- a/multiton/README.md +++ b/multiton/README.md @@ -15,18 +15,18 @@ Registry ## Intent -Ensure a class only has limited number of instances and provide a global point of access to them. +Ensure a class only has a limited number of instances and provide a global point of access to them. ## Explanation -Real world example +Real-world example > The Nazgûl, also called ringwraiths or the Nine Riders, are Sauron's most terrible servants. By -> definition there's always nine of them. +> definition, there's always nine of them. In plain words -> Multiton pattern ensures there's predefined amount of instances available globally. +> Multiton pattern ensures there are a predefined amount of instances available globally. Wikipedia says @@ -81,29 +81,54 @@ public final class Nazgul { And here's how we access the `Nazgul` instances. ```java - LOGGER.info("KHAMUL={}", Nazgul.getInstance(NazgulName.KHAMUL)); - LOGGER.info("MURAZOR={}", Nazgul.getInstance(NazgulName.MURAZOR)); - LOGGER.info("DWAR={}", Nazgul.getInstance(NazgulName.DWAR)); - LOGGER.info("JI_INDUR={}", Nazgul.getInstance(NazgulName.JI_INDUR)); - LOGGER.info("AKHORAHIL={}", Nazgul.getInstance(NazgulName.AKHORAHIL)); - LOGGER.info("HOARMURATH={}", Nazgul.getInstance(NazgulName.HOARMURATH)); - LOGGER.info("ADUNAPHEL={}", Nazgul.getInstance(NazgulName.ADUNAPHEL)); - LOGGER.info("REN={}", Nazgul.getInstance(NazgulName.REN)); - LOGGER.info("UVATHA={}", Nazgul.getInstance(NazgulName.UVATHA)); +// eagerly initialized multiton +LOGGER.info("Printing out eagerly initialized multiton contents"); +LOGGER.info("KHAMUL={}", Nazgul.getInstance(NazgulName.KHAMUL)); +LOGGER.info("MURAZOR={}", Nazgul.getInstance(NazgulName.MURAZOR)); +LOGGER.info("DWAR={}", Nazgul.getInstance(NazgulName.DWAR)); +LOGGER.info("JI_INDUR={}", Nazgul.getInstance(NazgulName.JI_INDUR)); +LOGGER.info("AKHORAHIL={}", Nazgul.getInstance(NazgulName.AKHORAHIL)); +LOGGER.info("HOARMURATH={}", Nazgul.getInstance(NazgulName.HOARMURATH)); +LOGGER.info("ADUNAPHEL={}", Nazgul.getInstance(NazgulName.ADUNAPHEL)); +LOGGER.info("REN={}", Nazgul.getInstance(NazgulName.REN)); +LOGGER.info("UVATHA={}", Nazgul.getInstance(NazgulName.UVATHA)); + +// enum multiton +LOGGER.info("Printing out enum-based multiton contents"); +LOGGER.info("KHAMUL={}", NazgulEnum.KHAMUL); +LOGGER.info("MURAZOR={}", NazgulEnum.MURAZOR); +LOGGER.info("DWAR={}", NazgulEnum.DWAR); +LOGGER.info("JI_INDUR={}", NazgulEnum.JI_INDUR); +LOGGER.info("AKHORAHIL={}", NazgulEnum.AKHORAHIL); +LOGGER.info("HOARMURATH={}", NazgulEnum.HOARMURATH); +LOGGER.info("ADUNAPHEL={}", NazgulEnum.ADUNAPHEL); +LOGGER.info("REN={}", NazgulEnum.REN); +LOGGER.info("UVATHA={}", NazgulEnum.UVATHA); ``` Program output: ``` -KHAMUL=com.iluwatar.multiton.Nazgul@2b214b94 -MURAZOR=com.iluwatar.multiton.Nazgul@17814b1c -DWAR=com.iluwatar.multiton.Nazgul@7ac9af2a -JI_INDUR=com.iluwatar.multiton.Nazgul@7bb004b8 -AKHORAHIL=com.iluwatar.multiton.Nazgul@78e89bfe -HOARMURATH=com.iluwatar.multiton.Nazgul@652ce654 -ADUNAPHEL=com.iluwatar.multiton.Nazgul@522ba524 -REN=com.iluwatar.multiton.Nazgul@29c5ee1d -UVATHA=com.iluwatar.multiton.Nazgul@15cea7b0 +20:35:07.413 [main] INFO com.iluwatar.multiton.App - Printing out eagerly initialized multiton contents +20:35:07.417 [main] INFO com.iluwatar.multiton.App - KHAMUL=com.iluwatar.multiton.Nazgul@48cf768c +20:35:07.419 [main] INFO com.iluwatar.multiton.App - MURAZOR=com.iluwatar.multiton.Nazgul@7960847b +20:35:07.419 [main] INFO com.iluwatar.multiton.App - DWAR=com.iluwatar.multiton.Nazgul@6a6824be +20:35:07.419 [main] INFO com.iluwatar.multiton.App - JI_INDUR=com.iluwatar.multiton.Nazgul@5c8da962 +20:35:07.419 [main] INFO com.iluwatar.multiton.App - AKHORAHIL=com.iluwatar.multiton.Nazgul@512ddf17 +20:35:07.419 [main] INFO com.iluwatar.multiton.App - HOARMURATH=com.iluwatar.multiton.Nazgul@2c13da15 +20:35:07.419 [main] INFO com.iluwatar.multiton.App - ADUNAPHEL=com.iluwatar.multiton.Nazgul@77556fd +20:35:07.419 [main] INFO com.iluwatar.multiton.App - REN=com.iluwatar.multiton.Nazgul@368239c8 +20:35:07.420 [main] INFO com.iluwatar.multiton.App - UVATHA=com.iluwatar.multiton.Nazgul@9e89d68 +20:35:07.420 [main] INFO com.iluwatar.multiton.App - Printing out enum-based multiton contents +20:35:07.420 [main] INFO com.iluwatar.multiton.App - KHAMUL=KHAMUL +20:35:07.420 [main] INFO com.iluwatar.multiton.App - MURAZOR=MURAZOR +20:35:07.420 [main] INFO com.iluwatar.multiton.App - DWAR=DWAR +20:35:07.420 [main] INFO com.iluwatar.multiton.App - JI_INDUR=JI_INDUR +20:35:07.421 [main] INFO com.iluwatar.multiton.App - AKHORAHIL=AKHORAHIL +20:35:07.421 [main] INFO com.iluwatar.multiton.App - HOARMURATH=HOARMURATH +20:35:07.421 [main] INFO com.iluwatar.multiton.App - ADUNAPHEL=ADUNAPHEL +20:35:07.421 [main] INFO com.iluwatar.multiton.App - REN=REN +20:35:07.421 [main] INFO com.iluwatar.multiton.App - UVATHA=UVATHA ``` ## Class diagram @@ -114,5 +139,5 @@ UVATHA=com.iluwatar.multiton.Nazgul@15cea7b0 Use the Multiton pattern when -* There must be specific number of instances of a class, and they must be accessible to clients from +* There must be a specific number of instances of a class, and they must be accessible to clients from a well-known access point. diff --git a/multiton/src/main/java/com/iluwatar/multiton/App.java b/multiton/src/main/java/com/iluwatar/multiton/App.java index e21cd11a2..52c7116ec 100644 --- a/multiton/src/main/java/com/iluwatar/multiton/App.java +++ b/multiton/src/main/java/com/iluwatar/multiton/App.java @@ -26,13 +26,13 @@ package com.iluwatar.multiton; import lombok.extern.slf4j.Slf4j; /** - * Whereas Singleton design pattern introduces single globally accessible object the Multiton + * Whereas Singleton design pattern introduces single globally accessible object, the Multiton * pattern defines many globally accessible objects. The client asks for the correct instance from - * the Multiton by passing an enumeration as parameter. + * the Multiton by passing an enumeration as a parameter. * *

There is more than one way to implement the multiton design pattern. In the first example * {@link Nazgul} is the Multiton and we can ask single {@link Nazgul} from it using {@link - * NazgulName}. The {@link Nazgul}s are statically initialized and stored in concurrent hash map. + * NazgulName}. The {@link Nazgul}s are statically initialized and stored in a concurrent hash map. * *

In the enum implementation {@link NazgulEnum} is the multiton. It is static and mutable * because of the way java supports enums. @@ -47,6 +47,7 @@ public class App { */ public static void main(String[] args) { // eagerly initialized multiton + LOGGER.info("Printing out eagerly initialized multiton contents"); LOGGER.info("KHAMUL={}", Nazgul.getInstance(NazgulName.KHAMUL)); LOGGER.info("MURAZOR={}", Nazgul.getInstance(NazgulName.MURAZOR)); LOGGER.info("DWAR={}", Nazgul.getInstance(NazgulName.DWAR)); @@ -58,6 +59,7 @@ public class App { LOGGER.info("UVATHA={}", Nazgul.getInstance(NazgulName.UVATHA)); // enum multiton + LOGGER.info("Printing out enum-based multiton contents"); LOGGER.info("KHAMUL={}", NazgulEnum.KHAMUL); LOGGER.info("MURAZOR={}", NazgulEnum.MURAZOR); LOGGER.info("DWAR={}", NazgulEnum.DWAR); diff --git a/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java b/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java index 88255c015..b30ce64a9 100644 --- a/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java +++ b/multiton/src/test/java/com/iluwatar/multiton/NazgulTest.java @@ -48,5 +48,4 @@ public class NazgulTest { assertEquals(name, nazgul.getName()); } } - } -- GitLab