Singleton Pattern

Singleton Pattern

Definition

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ, μ–΄λ–€ ν΄λž˜μŠ€κ°€ 졜초 ν•œ 번만 λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ή(static)ν•˜κ³  ν•΄λ‹Ή λ©”λͺ¨λ¦¬μ— μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄.

μ‰½κ²Œ μ–˜κΈ°ν•˜λ©΄ 싱글톀 νŒ¨ν„΄μ€ ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ§Œ μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄,

즉, 객체의 μΈμŠ€ν„΄μŠ€κ°€ 였직 1개만 μƒμ„±λ˜λŠ” νŒ¨ν„΄μ„ μ˜λ―Έν•œλ‹€.

싱글톀 νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λŠ” 방법은 μ—¬λŸ¬ κ°€μ§€κ°€ μžˆμ§€λ§Œ, 객체λ₯Ό 미리 생성해두고 κ°€μ Έμ˜€λŠ” 방법이 κ°€μž₯ λ‹¨μˆœν•˜κ³  μ•ˆμ „ν•˜λ‹€.


Example

Java

public class Singleton {

    private static Singleton instance = new Singleton();

    private Singleton() {
        // ...
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

Golang

μΈμŠ€ν„΄μŠ€κ°€ ν•„μš”ν•  λ•Œ, λ˜‘κ°™μ€ μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  기쑴의 μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμš©.


Why Singleton Pattern ?

μ΄λ ‡κ²Œ μΈμŠ€ν„΄μŠ€λ₯Ό 였직 ν•œ 개둜만 κ°€μ Έκ°€κ²Œ 되면 λͺ‡ κ°€μ§€ 이점이 μžˆλ‹€.

1. λ©”λͺ¨λ¦¬ μΈ‘λ©΄

졜초 ν•œλ²ˆλ§Œ κ³ μ •λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μΆ”ν›„ ν•΄λ‹Ή 객체에 μ ‘κ·Όν•  λ•Œ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό λ°©μ§€ν•  수 μžˆλ‹€.

λ˜ν•œ 이미 μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό ν™œμš©ν•˜λ‹ˆ 속도 μΈ‘λ©΄μ—μ„œλ„ 이점이 μžˆλ‹€κ³  λ³Ό 수 μžˆλ‹€.

2. 곡유의 이점

싱글톀 μΈμŠ€ν„΄μŠ€λŠ” μ „μ—­μœΌλ‘œ μ‚¬μš©λ˜κΈ° λ•Œλ¬Έμ— μ„œλ‘œ λ‹€λ₯Έ 객체간에 데이터 κ³΅μœ κ°€ 쉽닀.

ν•˜μ§€λ§Œ μ—¬λŸ¬ 객체의 μΈμŠ€ν„΄μŠ€μ—μ„œ μ‹±κΈ€ν„΄ μΈμŠ€ν„΄μŠ€μ˜ 데이터에 λ™μ‹œμ— μ ‘κ·Όν•˜κ²Œ 되면 λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμ–΄μ„œ 이 점에 μœ μ˜ν•΄μ•Όν•œλ‹€.

보톡 싱글톀 νŒ¨ν„΄μ€ κ³΅ν†΅λœ 객체λ₯Ό μ—¬λŸ¬ 개 μƒμ„±ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 상황,

예λ₯Ό λ“€λ©΄ λ°μ΄ν„°λ² μ΄μŠ€μ˜ 컀λ„₯μ…˜ ν’€, μŠ€λ ˆλ“œ ν’€, μΊμ‹œ, 둜그 기둝 객체 등에 많이 μ‚¬μš©ν•œλ‹€.

이 외에도 도메인 κ΄€μ μ—μ„œ μΈμŠ€ν„΄μŠ€κ°€ ν•œ 개만 μ‘΄μž¬ν•˜λŠ” 것을 λ³΄μ¦ν•˜κ³  싢은 경우 싱글톀 νŒ¨ν„΄μ„ μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€.


Problems

싱글톀 νŒ¨ν„΄μ„ μ μš©ν•˜λ©΄ μœ„μ™€ 같은 효율적인 μΈ‘λ©΄μ—μ„œμ˜ 이점이 μžˆμ§€λ§Œ, λ‹€μŒκ³Ό 같은 문제점이 λ°œμƒν•  수 μžˆλ‹€.

κ°œλ°œμžλŠ” μ΄λŸ¬ν•œ 문제점과 이점의 trade-offλ₯Ό 잘 κ³ λ €ν•΄μ•Όν•œλ‹€.

개방-폐쇄 원칙 μœ„λ°°

λ§Œμ•½ 싱글톀 μΈμŠ€ν„΄μŠ€κ°€ 혼자 λ„ˆλ¬΄ λ§Žμ€ 일을 ν•˜κ±°λ‚˜, λ§Žμ€ 데이터λ₯Ό κ³΅μœ μ‹œν‚€λ©΄ λ‹€λ₯Έ ν΄λž˜μŠ€λ“€ κ°„μ˜ 결합도가 λ†’μ•„μ§€κ²Œ λ˜λŠ”λ°, μ΄λ•Œ 개방-폐쇄 원칙이 μœ„λ°°λœλ‹€.

결합도가 λ†’μ•„μ§€λ©΄ μœ μ§€λ³΄μˆ˜κ°€ νž˜λ“€κ³  ν…ŒμŠ€νŠΈλ„ μ›ν™œν•˜κ²Œ μ§„ν–‰ν•˜κΈ° νž˜λ“€λ‹€.

λ™μ‹œμ„± 문제

정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œμ—μ„œ 객체 생성을 ν™•μΈν•˜κ³  μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” κ²½μš°μ—, λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” λ™μ‹œμ„± λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€.

λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ 동기화 처리λ₯Ό ν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ μΈμŠ€ν„΄μŠ€κ°€ 2κ°œκ°€ μƒμ„±λ˜λŠ” λ¬Έμ œλ„ λ°œμƒν•  수 μžˆλ‹€.

μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ 동기화 처리λ₯Ό ν•œλ‹€λ©΄ 효율 μ €ν•˜ 및 좔가적인 μ½”λ“œ μž‘μ„±μ΄ λ°œμƒν•œλ‹€.

Last updated