From 14c4710435e89218404086816682012eff023497 Mon Sep 17 00:00:00 2001 From: Vivek Singh Date: Tue, 8 Dec 2020 10:34:42 +0530 Subject: [PATCH] Implemented Registry pattern (#1543) * #1310 Implemented registry pattern * fixed parent pom version * added empty line in registry.urm.puml Co-authored-by: Subhrodip Mohanta --- pom.xml | 1 + registry/README.md | 86 ++++++++++++++++++ registry/etc/registry.png | Bin 0 -> 16875 bytes registry/etc/registry.urm.puml | 21 +++++ registry/pom.xml | 46 ++++++++++ .../main/java/com/iluwatar/registry/App.java | 27 ++++++ .../java/com/iluwatar/registry/Customer.java | 28 ++++++ .../iluwatar/registry/CustomerRegistry.java | 28 ++++++ .../registry/CustomerRegistryTest.java | 44 +++++++++ 9 files changed, 281 insertions(+) create mode 100644 registry/README.md create mode 100644 registry/etc/registry.png create mode 100644 registry/etc/registry.urm.puml create mode 100644 registry/pom.xml create mode 100644 registry/src/main/java/com/iluwatar/registry/App.java create mode 100644 registry/src/main/java/com/iluwatar/registry/Customer.java create mode 100644 registry/src/main/java/com/iluwatar/registry/CustomerRegistry.java create mode 100644 registry/src/test/java/com/iluwatar/registry/CustomerRegistryTest.java diff --git a/pom.xml b/pom.xml index e7fd2e4b3..86cefa133 100644 --- a/pom.xml +++ b/pom.xml @@ -195,6 +195,7 @@ strangler arrange-act-assert transaction-script + registry filterer factory separated-interface diff --git a/registry/README.md b/registry/README.md new file mode 100644 index 000000000..699c13318 --- /dev/null +++ b/registry/README.md @@ -0,0 +1,86 @@ +--- +layout: pattern +title: Registry +folder: registry +permalink: /patterns/registry/ +categories: Creational +tags: + - Instantiation +--- + +## Intent +Stores the objects of a single class and provide a global point of access to them. +Similar to Multiton pattern, only difference is that in a registry there is no restriction on the number of objects. + +## Explanation + +In Plain Words + +> Registry is a well-known object that other objects can use to find common objects and services. + +**Programmatic Example** +Below is a `Customer` Class + +```java +public class Customer { + + private final String id; + private final String name; + + public Customer(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + +} +``` + +This registry of the `Customer` objects is `CustomerRegistry` +```java +public final class CustomerRegistry { + + private static final CustomerRegistry instance = new CustomerRegistry(); + + public static CustomerRegistry getInstance() { + return instance; + } + + private final Map customerMap; + + private CustomerRegistry() { + customerMap = new ConcurrentHashMap<>(); + } + + public Customer addCustomer(Customer customer) { + return customerMap.put(customer.getId(), customer); + } + + public Customer getCustomer(String id) { + return customerMap.get(id); + } + +} +``` + +## Class diagram +![Registry](./etc/registry.png) + +## Applicability +Use Registry pattern when + +* client wants reference of some object, so client can lookup for that object in the object's registry. + +## Consequences +Large number of bulky objects added to registry would result in a lot of memory consumption as objects in the registry are not garbage collected. + +## Credits +* https://www.martinfowler.com/eaaCatalog/registry.html +* https://wiki.c2.com/?RegistryPattern diff --git a/registry/etc/registry.png b/registry/etc/registry.png new file mode 100644 index 0000000000000000000000000000000000000000..6c1c5b986d72cb33d1806c8d43ebc4a31e4927c9 GIT binary patch literal 16875 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 "-addCustomer" CustomerRegistry +@enduml diff --git a/registry/pom.xml b/registry/pom.xml new file mode 100644 index 000000000..852bcacfd --- /dev/null +++ b/registry/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + + com.iluwatar + java-design-patterns + 1.24.0-SNAPSHOT + + registry + + + + org.junit.jupiter + junit-jupiter-engine + test + + + junit + junit + + + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + + + + com.iluwatar.registry.App + + + + + + + + + + diff --git a/registry/src/main/java/com/iluwatar/registry/App.java b/registry/src/main/java/com/iluwatar/registry/App.java new file mode 100644 index 000000000..a593ce5cc --- /dev/null +++ b/registry/src/main/java/com/iluwatar/registry/App.java @@ -0,0 +1,27 @@ +package com.iluwatar.registry; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class App { + + private static final Logger LOGGER = LoggerFactory.getLogger(App.class); + + /** + * Program entry point. + * + * @param args command line args + */ + public static void main(String[] args) { + CustomerRegistry customerRegistry = CustomerRegistry.getInstance(); + var john = new Customer("1", "John"); + customerRegistry.addCustomer(john); + + var julia = new Customer("2", "Julia"); + customerRegistry.addCustomer(julia); + + LOGGER.info("John {}", customerRegistry.getCustomer("1")); + LOGGER.info("Julia {}", customerRegistry.getCustomer("2")); + } + +} diff --git a/registry/src/main/java/com/iluwatar/registry/Customer.java b/registry/src/main/java/com/iluwatar/registry/Customer.java new file mode 100644 index 000000000..354999fdf --- /dev/null +++ b/registry/src/main/java/com/iluwatar/registry/Customer.java @@ -0,0 +1,28 @@ +package com.iluwatar.registry; + +public class Customer { + + private final String id; + private final String name; + + public Customer(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "Customer{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/registry/src/main/java/com/iluwatar/registry/CustomerRegistry.java b/registry/src/main/java/com/iluwatar/registry/CustomerRegistry.java new file mode 100644 index 000000000..406d616c6 --- /dev/null +++ b/registry/src/main/java/com/iluwatar/registry/CustomerRegistry.java @@ -0,0 +1,28 @@ +package com.iluwatar.registry; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public final class CustomerRegistry { + + private static final CustomerRegistry instance = new CustomerRegistry(); + + public static CustomerRegistry getInstance() { + return instance; + } + + private final Map customerMap; + + private CustomerRegistry() { + customerMap = new ConcurrentHashMap<>(); + } + + public Customer addCustomer(Customer customer) { + return customerMap.put(customer.getId(), customer); + } + + public Customer getCustomer(String id) { + return customerMap.get(id); + } + +} diff --git a/registry/src/test/java/com/iluwatar/registry/CustomerRegistryTest.java b/registry/src/test/java/com/iluwatar/registry/CustomerRegistryTest.java new file mode 100644 index 000000000..2919390b9 --- /dev/null +++ b/registry/src/test/java/com/iluwatar/registry/CustomerRegistryTest.java @@ -0,0 +1,44 @@ +package com.iluwatar.registry; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class CustomerRegistryTest { + + private static CustomerRegistry customerRegistry; + + @BeforeAll + public static void setUp() { + customerRegistry = CustomerRegistry.getInstance(); + } + + @Test + public void shouldBeAbleToAddAndQueryCustomerObjectFromRegistry() { + Customer john = new Customer("1", "john"); + Customer julia = new Customer("2", "julia"); + + customerRegistry.addCustomer(john); + customerRegistry.addCustomer(julia); + + Customer customerWithId1 = customerRegistry.getCustomer("1"); + assertNotNull(customerWithId1); + assertEquals("1", customerWithId1.getId()); + assertEquals("john", customerWithId1.getName()); + + Customer customerWithId2 = customerRegistry.getCustomer("2"); + assertNotNull(customerWithId2); + assertEquals("2", customerWithId2.getId()); + assertEquals("julia", customerWithId2.getName()); + } + + @Test + public void shouldReturnNullWhenQueriedCustomerIsNotInRegistry() { + Customer customerWithId5 = customerRegistry.getCustomer("5"); + assertNull(customerWithId5); + } + +} -- GitLab