README.md 3.3 KB
Newer Older
1 2 3 4
---
layout: pattern
title: Singleton
folder: singleton
5
permalink: /patterns/singleton/
M
Markus 已提交
6
categories: Creational
7
tags:
8
 - Gang of Four
9 10
---

11
## Intent
I
Ilkka Seppälä 已提交
12 13

Ensure a class only has one instance, and provide a global point of access to it.
14

15 16

## Explanation
I
Ilkka Seppälä 已提交
17

18
Real world example
I
Ilkka Seppälä 已提交
19

I
Ilkka Seppälä 已提交
20 21
> There can only be one ivory tower where the wizards study their magic. The same enchanted ivory 
> tower is always used by the wizards. Ivory tower here is singleton.
22 23

In plain words
I
Ilkka Seppälä 已提交
24

25 26 27
> Ensures that only one object of a particular class is ever created.

Wikipedia says
I
Ilkka Seppälä 已提交
28

I
Ilkka Seppälä 已提交
29 30 31
> In software engineering, the singleton pattern is a software design pattern that restricts the 
> instantiation of a class to one object. This is useful when exactly one object is needed to 
> coordinate actions across the system.
32 33 34 35

**Programmatic Example**

Joshua Bloch, Effective Java 2nd Edition p.18
I
Ilkka Seppälä 已提交
36

37
> A single-element enum type is the best way to implement a singleton
I
Ilkka Seppälä 已提交
38

39
```java
40
public enum EnumIvoryTower {
I
Ilkka Seppälä 已提交
41
  INSTANCE
42 43
}
```
I
Ilkka Seppälä 已提交
44

I
Ilkka Seppälä 已提交
45
Then in order to use:
I
Ilkka Seppälä 已提交
46

47
```java
48 49
var enumIvoryTower1 = EnumIvoryTower.INSTANCE;
var enumIvoryTower2 = EnumIvoryTower.INSTANCE;
50 51
assertEquals(enumIvoryTower1, enumIvoryTower2); // true
```
52

53
## Class diagram
I
Ilkka Seppälä 已提交
54

55 56
![alt text](./etc/singleton.urm.png "Singleton pattern class diagram")

57
## Applicability
I
Ilkka Seppälä 已提交
58

59
Use the Singleton pattern when
60

61 62
* There must be exactly one instance of a class, and it must be accessible to clients from a well-known access point
* When the sole instance should be extensible by subclassing, and clients should be able to use an extended instance without modifying their code
63

64
## Typical Use Case
65

66 67 68
* The logging class
* Managing a connection to a database
* File manager
69

70
## Real world examples
71

72
* [java.lang.Runtime#getRuntime()](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime%28%29)
73 74 75
* [java.awt.Desktop#getDesktop()](http://docs.oracle.com/javase/8/docs/api/java/awt/Desktop.html#getDesktop--)
* [java.lang.System#getSecurityManager()](http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getSecurityManager--)

76

77 78 79 80
## Consequences

* Violates Single Responsibility Principle (SRP) by controlling their own creation and lifecycle.
* Encourages using a global shared instance which prevents an object and resources used by this object from being deallocated.     
81
* Creates tightly coupled code. The clients of the Singleton become difficult to test.
82
* Makes it almost impossible to subclass a Singleton.
83

84
## Credits
85

I
Ilkka Seppälä 已提交
86 87
* [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/gp/product/0201633612/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0201633612&linkCode=as2&tag=javadesignpat-20&linkId=675d49790ce11db99d90bde47f1aeb59)
* [Effective Java](https://www.amazon.com/gp/product/0134685997/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0134685997&linkCode=as2&tag=javadesignpat-20&linkId=4e349f4b3ff8c50123f8147c828e53eb)
88
* [Head First Design Patterns: A Brain-Friendly Guide](https://www.amazon.com/gp/product/0596007124/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596007124&linkCode=as2&tag=javadesignpat-20&linkId=6b8b6eea86021af6c8e3cd3fc382cb5b)
89
* [Refactoring to Patterns](https://www.amazon.com/gp/product/0321213351/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0321213351&linkCode=as2&tag=javadesignpat-20&linkId=2a76fcb387234bc71b1c61150b3cc3a7)