본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


DesignPattern

디자인 패턴 2 - Singleton pattern

반응형

Singleton pattern은 어떠한 클래스(객체) 가 유일하게 1개만 존재 할 때 사용한다 

이를 주로 사용하는 곳은 서로 자원을 공유 할 때 사용되는데 , 실물 세계에서는 프린터가 해당되며 , 실제 프로그래밍에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용한다.

 

package com.company.singleton;

public class ClazzA {

    private SocketClient socketClient;

    public ClazzA(){
        this.socketClient = SocketClient.getInstance();
    };

    public SocketClient getSocketClient(){
        return this.socketClient;
    };

}

 

package com.company.singleton;

public class ClazzB {

    private SocketClient socketClient;

    public ClazzB(){
        this.socketClient = SocketClient.getInstance();
    }

    public SocketClient getSocketClient(){
        return this.socketClient;
    }
}

 

package com.company.singleton;

public class SocketClient {

    private static SocketClient socketClient = null;

    //생성은 막아준다.
    private SocketClient(){};

    //다른 클래스에서 호출 가능한 메서드
    public static SocketClient getInstance(){
        if(socketClient == null){
            socketClient = new SocketClient();
        }
        return socketClient;
    };

    public void connect(){
        System.out.println("connect");
    };

}

 

package com.company;

import com.company.singleton.ClazzA;
import com.company.singleton.ClazzB;
import com.company.singleton.SocketClient;

public class Main {

    public static void main(String[] args) {
        ClazzA clazzA = new ClazzA();
        ClazzB clazzB = new ClazzB();

        //싱글톤 방식으로 생성되는 객체를 참조하기 떄문에
        //ClientA와 B는 같은 객체를 참조하고 있다.
        SocketClient ClientA = clazzA.getSocketClient();
        SocketClient ClientB = clazzB.getSocketClient();

        //true가 나온다
        System.out.println(ClientA.equals(ClientB));
    }
}

 

위의 4가지 클래스 중 SocketClient는 싱글톤 방식으로  생성자가 private로 되어 외부에서 접근할 수 없으며(외부에서 생성 불가) 외부에서는  SocketClient 스테틱 메서드인 getInstance를 통해서만. 해당 객체를 사용할 수 있다. 

외부에서 getInstance를 호출시 만약 SocketClient 자기 자신을 담는 필드인 socketClient 변수에 인스턴스가 저장되어 있다면 해당 인스턴스를 반환하며 null일 경우 객체를 생성하여 반환한다 . 

 

ClazzA , ClazzB는 생성시  SocketClient를 주입받는 형식으로 되어 있다. 

 

메인메서드에서 clazzA를 생성할 시 SocketClient에서는 SocketClient 가 생성되어 반환되고 자기 자신의 필드에도 저장된다.  그렇게 되면 clazzB를 생성할 시에는 SocketClient의 필드에 저장된 SocketClient 객체가 반환됨으로 

 

결국 clazzA와 clazzB는 같은  인스턴스를 주입 받은 것이며 이러한 패턴을 Singleton pattern이라 한다.

 

 

반응형