+) 22. 08. 23. μΆκ°
μ±κΈν€ ν¨ν΄μ΄λ, κ°μ²΄μ μΈμ€ν΄μ€κ° μ€μ§ 1κ°λ§ μμ±λλ ν¨ν΄μ μλ―Ένλ€.
μ±κΈν€ ν¨ν΄μ ν΄λμ€κ° μ€μ§ νλμ¬μΌ ν¨μ 보μ₯νλ κ³³, λλ λͺ¨λ ν΄λΌμ΄μΈνΈκ° νλμ μΈμ€ν΄μ€λ§ μ¬μ©ν΄μΌ νλ κ²½μ°μ νμ©ν μ μλ€.
public class Singleton {
//κ°μ²΄λ₯Ό 미리 μμ±ν΄λκ³ κ°μ Έμ€λ λ°©λ².
private static Singleton instance = new Singleton();
private Singleton() {
//μμ±μλ μΈλΆμμ νΈμΆνμ§ λͺ»νκ² privateμΌλ‘ μ§μ ν΄μΌ νλ€.
}
public static Singleton getInstance() {
return instance;
}
}
public class Speaker {
//μλλ private. getter, setter νμνμ§λ§ νΈμμ publicμΌλ‘ ν¨.
public int volume = 5;
//2. private static μΈμ€ν΄μ€ λ³μ
private static Speaker instance;
//3. public static getInstance() method ꡬν
public static getInstance() {
if(instance == null) {
instance = new Speaker();
}
return instance;
}
//1. private μμ±μ
private Speaker() {}
}
public static void main(String[] args) {
//κ°μ²΄1 μμ±
Speaker speaker1 = Speaker.getInstance();
//κ°μ²΄2 μμ±
Speaker speaker2 = Speaker.getInstance();
//κ°μ²΄μ μ£Όμ λΉκ΅ (λκ°μ μ£Όμκ°μ΄ λμ¨λ€. -> κ°μ μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€κ³ μλ€.)
System.out.println(speaker1);
System.out.println(speaker2);
//κ°μ²΄μ attributeκ° μ½μ΄μ€κΈ° (λ λ€ 5κ° λμ¨λ€.)
System.out.println(speaker1.volume);
System.out.println(speaker2.volume);
}
class Singleton {
/* static + μ€μ²© ν΄λμ€(νλ): μ ν리μΌμ΄μ
λΉ λ¨ νλ + singleInstanceHolderλ₯Ό μ€μ λ‘ μ¬μ©ν λκΉμ§ λ―Έλ£Έ. μ μ μ΄κΈ°νλ‘ μμ±λλ―λ‘ μ€λ λ μΈμ΄ννλ€. */
/* final: λ€μ κ°μ΄ ν λΉλμ§ μκ²(read only) / λλ¬Έμλ‘ λ³μ μ μΈ */
private static class singleInstanceHolder {
private static final Singleton INSTANCE = new Singleton();
}
private static Singleton getInstance() {
return singleInstanceHolder.INSTANCE;
}
}
μ±κΈν€ ν¨ν΄ μ¬μ© μ μ΄μ
κ³ μ λ λ©λͺ¨λ¦¬ μμμ κ°μ§κ³ νλμ μΈμ€ν΄μ€λ§ μ¬μ©νκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ λλΉλ₯Ό λ°©μ§ν μ μλ€.
μ±κΈν€ ν΄λμ€μ μΈμ€ν΄μ€λ μ μμ΄κΈ° λλ¬Έμ λ€λ₯Έ ν΄λμ€μ μΈμ€ν΄μ€λ€μ΄ λ°μ΄ν°λ₯Ό 곡μ νκΈ°κ° μ½λ€.
μ±κΈν€ ν¨ν΄ μ¬μ© μ λ¬Έμ μ
μ±κΈν€ ν¨ν΄μ ꡬννλ μ½λ μμ²΄κ° λ§μ΄ νμνλ€. λ©ν°μ€λ λ© νκ²½μμ λ°μν μ μλ λμμ± λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ synchronized ν€μλλ₯Ό μ¬μ©ν΄μΌ νλ€.
ν μ€νΈνκΈ° μ΄λ ΅λ€. μ±κΈν€ μΈμ€ν΄μ€λ μμμ 곡μ νκΈ° λλ¬Έμ ν μ€νΈκ° κ²°μ μ μΌλ‘ 격리λ νκ²½μμ μνλλ €λ©΄ λ§€λ² μΈμ€ν΄μ€μ μνλ₯Ό μ΄κΈ°νμμΌ μ£Όμ΄μΌ νλ€.
μμ‘΄ κ΄κ³ μ ν΄λΌμ΄μΈνΈκ° ꡬ체 ν΄λμ€μ μμ‘΄νκ² λλ€. new ν€μλλ₯Ό μ§μ μ¬μ©νμ¬ ν΄λμ€ μμμ κ°μ²΄λ₯Ό μμ±νκ³ μμΌλ―λ‘, μ΄λ SOLID μμΉ μ€ DIPλ₯Ό μλ°νκ² λκ³ , OCP λν μλ°ν κ°λ₯μ±μ΄ λλ€.
μ±κΈν€ ν¨ν΄μ μ€μ§ ν κ°μ μΈμ€ν΄μ€ μμ±μ 보μ¦νμ¬ ν¨μ¨μ λμΌ μ μμ§λ§, κ·Έμ λͺ»μ§μκ² λ¬Έμ μ λ λ§λ€.
νμ§λ§ μ€νλ§ μ»¨ν
μ΄λ κ°μ νλ μμν¬μ λμμ λ°μΌλ©΄ μ±κΈν€ ν¨ν΄μ λ¬Έμ μ μ 보μνλ©΄μ μ΄μ λ λ릴 μ μλ€. μ€μ λ‘ μ€νλ§ λΉμ 컨ν
μ΄λμ λμμ λ°μ μ±κΈν€ μ€μ½νλ‘ κ΄λ¦¬λκ³ μλ€.
νλ μμν¬μ λμμμ΄ μ±κΈν€ ν¨ν΄μ μ μ©νκ³ μΆλ€λ©΄ μμμ μ΄ν΄λ³Έ μ₯λ¨μ μ trade-offλ₯Ό κ³ λ €νμ¬ μ¬μ©νλ κ²μ΄ μ’μ κ²μ΄λ€.
μ°Έκ³ μλ£
Tecoble 2κΈ°_보μ€λ , βμ±κΈν€(Singleton) ν¨ν΄μ΄λ?β, https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
μ§μ° μ½λ©, βκ°μ²΄μ§ν₯ μλ° μ±κΈν€ ν¨ν΄ Singleton Patternβ, https://youtu.be/Cs3g44R9seo
ν°λμν°μ , βμ±κΈν€ν¨ν΄ | λμμΈν¨ν΄β, https://youtu.be/DHo8qRCtmGU
μ°μνTech, β[10λΆ ν μ½ν‘] π§ ν¬λ‘νμ μ±κΈν΄κ³Ό μ μ ν΄λμ€β, https://youtu.be/C6CczyrkYXU
ν¨κ» 보면 μ’μ μλ£