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
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
Registry
2016-01-03 21:14:30 +01:00
## Intent
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
> The Nazgûl, also called ringwraiths or the Nine Riders, are Sauron's most terrible servants. By definition there's always nine of them.
In plain words
> Multiton pattern ensures there's predefined amount of instances available globally.
Wikipedia says
> 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.
**Programmatic Example**
Nazgul is the multiton class.
```java
public enum NazgulName {
KHAMUL, MURAZOR, DWAR, JI_INDUR, AKHORAHIL, HOARMURATH, ADUNAPHEL, REN, UVATHA;
}
public final class Nazgul {
private static Map< NazgulName , Nazgul > nazguls;
private NazgulName name;
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;
}
}
```
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));
// 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
```
2015-08-13 23:54:40 +02:00
2019-12-07 20:01:13 +02:00
## Class diagram
2015-08-13 23:54:40 +02:00

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