개발 무지렁이

[Java] 디자인 패턴 中 생성패턴, 싱글톤(Singleton) 패턴 본문

Backend/자바

[Java] 디자인 패턴 中 생성패턴, 싱글톤(Singleton) 패턴

Gaejirang-e 2022. 11. 28. 14:57
📌. 디자인 패턴
: 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 설계상의 문제해결방법을 말한다.
: 개발자 사이에서 공유되고, 사용되는 검증된 솔루션이다.
🧩일관성, 🧩유지보수성, 🧩재사용성을 높인다.

       🥥. 생성패턴 in 디자인패턴
       :객체 생성과정을 유연하게 다룰 수 있다.

객체의 개수를 제어하는 싱글톤 패턴


생성자의 접근제한자private로 두어
외부에서 사용자가 직접 객체를 생성하지 못하게 한다.
(🃏 개발자가 주는대로만 쓰게끔)
  (1) 'private 생성자'를 만들고,
  (2) '멤버필드를 하나만 생성'하고,
  (3) '가져다 쓸 수 있는 메서드'를 만든다

  ☝️ (백번호출해도) '하나만 만들어놓고 공유'해서 쓰는 형태
  class Singleton {
      private static Singleton instance = new Singleton();
      private Singleton() { }

      public static Singleton getInstance() { // 현재 객체내에서 자신을 생성해서 리턴해주는 메서드 제공, 외부에서 객체를 생성하지 않고 메서드에 접근할 수 있게끔 static
          return instance;
      }
  }
  // new Singleton(); No!! 외부에서 객체 생성 안됨
  // Singleton single = Singleton.getInstance();

  public class Main {
      public static void main(String[] args) {
          Singleton s1 = Singleton.getInstance();
          Singleton s2 = Singleton.getInstance();
          Singleton s3 = Singleton.getInstance();

          System.out.println("s1: " + s1);//s1: hello_java_world.Singleton@2ff4acd0
          System.out.println("s2: " + s2);//s2: hello_java_world.Singleton@2ff4acd0
          System.out.println("s3: " + s3);//s3: hello_java_world.Singleton@2ff4acd0
      }
  }    

객체의 개수가 꼭 하나가 아니어도 된다.


  ❓ 구청에 민원이 500개 들어왔다고 하자.. 창구직원(객체)이 500명 있어야할까?  
     -> '객체의 개수'를 '제한'하는 것이 핵심!!

[싱글톤.java]

  class 창구직원 {
      public static 창구직원 a창구직원;
      private 창구직원() {
          // 외부에서 new를 통한 객체 생성 불가능
      }
      public 창구직원 get창구직원() {
          if(a창구직원 == null) { // 객체가 없을 때
              a창구직원 = new 창구직원(); // 하나의 객체만 만든다
          }
          return a창구직원 // 객체가 이미 하나 있을 때, 기존 창구직원 재탕
      }
  }

[창구직원을 3명만 두고 재탕하는 구조.java]

  class 창구직원 {
      private int id;
      private static 창구직원 a마지막_창구직원;
      private static int lastId;

      static { // static 전용 생성자, 클래스가 로딩될 때 실행
          a마지막_창구직원 = null;
          lastId = 0;
      }

      private 창구직원(int id) {
          this.id = id;
      }

      public static 창구직원 get창구직원() {
          if(lastId == 3) { // 창구직원(객체)을 제한, 싱글톤
              return a마지막_창구직원; // 재탕
          }
          int id = ++lastId;
          창구직원 a창구직원 = new 창구직원(id);
          a마지막_창구직원 = a창구직원;
          return a창구직원;
      }

      public void 자기소개() {
          System.out.printf("저는 %d번 창구직원입니다\n", id);
      }
  }

  class Main {
      public static void main(String[] args) {
          창구직원[] 창구 = new 창구직원[7]; // 7개의 창구직원 자리가 있는 구청
          창구[0] = 창구직원.get창구직원(); // new 창구직원(1);
          창구[1] = 창구직원.get창구직원(); // new 창구직원(2);
          창구[2] = 창구직원.get창구직원(); // new 창구직원(3);
          창구[3] = 창구직원.get창구직원(); // a마지막_창구직원 재탕
          창구[4] = 창구직원.get창구직원(); // a마지막_창구직원 재탕
          창구[5] = 창구직원.get창구직원(); // a마지막_창구직원 재탕
          창구[6] = 창구직원.get창구직원(); // a마지막_창구직원 재탕

          for(int i = 0; i < 창구.length; i++) {
              창구[i].자기소개();
          }
          /* 출력
          저는 1번 창구직원입니다.
          저는 2번 창구직원입니다.
          저는 3번 창구직원입니다.
          저는 3번 창구직원입니다.
          저는 3번 창구직원입니다.
          저는 3번 창구직원입니다.
          저는 3번 창구직원입니다.
          */
      }
  }    
Comments