2015-08-13 23:54:40 +02:00
|
|
|
---
|
|
|
|
layout: pattern
|
|
|
|
title: Multiton
|
|
|
|
folder: multiton
|
2015-08-15 18:03:05 +02:00
|
|
|
permalink: /patterns/multiton/
|
2015-08-20 21:40:07 +02:00
|
|
|
categories: Creational
|
2021-05-19 10:49:05 -06:00
|
|
|
language: en
|
2015-12-28 15:52:44 +02:00
|
|
|
tags:
|
2019-12-13 21:09:28 +02:00
|
|
|
- Instantiation
|
2015-08-13 23:54:40 +02:00
|
|
|
---
|
|
|
|
|
2016-04-06 20:37:02 +03:00
|
|
|
## Also known as
|
2020-08-29 21:55:51 +03:00
|
|
|
|
2016-04-06 20:37:02 +03:00
|
|
|
Registry
|
|
|
|
|
2016-01-03 21:14:30 +01:00
|
|
|
## Intent
|
2020-08-29 21:55:51 +03:00
|
|
|
|
2020-07-19 19:37:40 +03:00
|
|
|
Ensure a class only has limited number of instances and provide a global point of access to them.
|
|
|
|
|
|
|
|
## Explanation
|
|
|
|
|
|
|
|
Real world example
|
|
|
|
|
2020-08-29 21:55:51 +03:00
|
|
|
> The Nazgûl, also called ringwraiths or the Nine Riders, are Sauron's most terrible servants. By
|
|
|
|
> definition there's always nine of them.
|
2020-07-19 19:37:40 +03:00
|
|
|
|
|
|
|
In plain words
|
|
|
|
|
|
|
|
> Multiton pattern ensures there's predefined amount of instances available globally.
|
|
|
|
|
|
|
|
Wikipedia says
|
|
|
|
|
2020-08-29 21:55:51 +03:00
|
|
|
> In software engineering, the multiton pattern is a design pattern which generalizes the singleton
|
|
|
|
> pattern. Whereas the singleton allows only one instance of a class to be created, the multiton
|
|
|
|
> pattern allows for the controlled creation of multiple instances, which it manages through the use
|
|
|
|
> of a map.
|
2020-07-19 19:37:40 +03:00
|
|
|
|
|
|
|
**Programmatic Example**
|
|
|
|
|
2020-08-29 21:55:51 +03:00
|
|
|
`Nazgul` is the multiton class.
|
2020-07-19 19:37:40 +03:00
|
|
|
|
|
|
|
```java
|
|
|
|
public enum NazgulName {
|
|
|
|
|
2020-07-30 20:28:47 +03:00
|
|
|
KHAMUL, MURAZOR, DWAR, JI_INDUR, AKHORAHIL, HOARMURATH, ADUNAPHEL, REN, UVATHA
|
2020-07-19 19:37:40 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public final class Nazgul {
|
|
|
|
|
2020-07-30 20:28:47 +03:00
|
|
|
private static final Map<NazgulName, Nazgul> nazguls;
|
2020-07-19 19:37:40 +03:00
|
|
|
|
2020-07-30 20:28:47 +03:00
|
|
|
private final NazgulName name;
|
2020-07-19 19:37:40 +03:00
|
|
|
|
|
|
|
static {
|
|
|
|
nazguls = new ConcurrentHashMap<>();
|
|
|
|
nazguls.put(NazgulName.KHAMUL, new Nazgul(NazgulName.KHAMUL));
|
|
|
|
nazguls.put(NazgulName.MURAZOR, new Nazgul(NazgulName.MURAZOR));
|
|
|
|
nazguls.put(NazgulName.DWAR, new Nazgul(NazgulName.DWAR));
|
|
|
|
nazguls.put(NazgulName.JI_INDUR, new Nazgul(NazgulName.JI_INDUR));
|
|
|
|
nazguls.put(NazgulName.AKHORAHIL, new Nazgul(NazgulName.AKHORAHIL));
|
|
|
|
nazguls.put(NazgulName.HOARMURATH, new Nazgul(NazgulName.HOARMURATH));
|
|
|
|
nazguls.put(NazgulName.ADUNAPHEL, new Nazgul(NazgulName.ADUNAPHEL));
|
|
|
|
nazguls.put(NazgulName.REN, new Nazgul(NazgulName.REN));
|
|
|
|
nazguls.put(NazgulName.UVATHA, new Nazgul(NazgulName.UVATHA));
|
|
|
|
}
|
|
|
|
|
|
|
|
private Nazgul(NazgulName name) {
|
|
|
|
this.name = name;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Nazgul getInstance(NazgulName name) {
|
|
|
|
return nazguls.get(name);
|
|
|
|
}
|
|
|
|
|
|
|
|
public NazgulName getName() {
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-08-29 21:55:51 +03:00
|
|
|
And here's how we access the `Nazgul` instances.
|
2020-07-19 19:37:40 +03:00
|
|
|
|
|
|
|
```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));
|
2020-08-29 21:55:51 +03:00
|
|
|
```
|
|
|
|
|
|
|
|
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
|
2020-07-19 19:37:40 +03:00
|
|
|
```
|
2015-08-13 23:54:40 +02:00
|
|
|
|
2019-12-07 20:01:13 +02:00
|
|
|
## Class diagram
|
2020-08-29 21:55:51 +03:00
|
|
|
|
2015-08-13 23:54:40 +02:00
|
|
|

|
|
|
|
|
2016-01-03 21:14:30 +01:00
|
|
|
## Applicability
|
2020-08-29 21:55:51 +03:00
|
|
|
|
2016-01-03 21:14:30 +01:00
|
|
|
Use the Multiton pattern when
|
2015-08-13 23:54:40 +02:00
|
|
|
|
2020-08-29 21:55:51 +03:00
|
|
|
* There must be specific number of instances of a class, and they must be accessible to clients from
|
|
|
|
a well-known access point.
|