본문 바로가기
자바

디자인 패턴 1. 싱글톤 패턴 (Singleton Pattern)

by 호놀롤루 2022. 3. 10.

1. 개요

Singleton Pattern 어떠한 클래스(객체) 유일하게 1개만 존재할  사용한다.이를 주로 사용하는 곳은 

서로 자원을 공유할  사용하는데, 실물 세계에서는 프린터가 해당되며, 실제 프로그래밍에서는 

TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용한다.

 

 

 

소켓의 경우, 매번 연결하는 것이 아닌, 한번 연결해놓은 클라이언트에 계속 연결되는 형태다.

 

만약 소켓에서 생성자를 private 아닌 public으로 하고, 사용하면서 다시 생성하게 하면 같은 client 나오지 않는다.

 

 같은 client 사용하려면 싱글톤의 방식을 사용해야 한다.

어떤 프로그램에서  하나의 객체만이 있어야 한다면 싱글톤 방식을 사용해야 한다.

2. 코드

 

package com.company.design.singleton;

public class SocketClient {

    private static SocketClient socketClient = null;

    private SocketClient(){
        // default constructor를 막고, 하나만 생성
    }

    public static SocketClient getInstance(){
        if (socketClient == null) {
            socketClient = new SocketClient(); // 최초 한번만 생성
        }
        return socketClient;
    }

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

일단 private static SocketClient 있으니 굳이 인스턴스 생성할 필요 없이 참조할  있다.

 

생성자를 private 해서 다른 데서 접근 못하게 한다.  생성 못함

 

그리고 getInstance SocketClient 반환받는다.

 

만약 socketClient null이면 new    생성한다.  다음부턴 생성되어 있으니 생성 안한다.

 

그리고 socketClient 반환한다.

 

package com.company.design.singleton;

public class AClazz {

    private SocketClient socketClient;

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

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

AClazz  이유는 class 예약어라 Clazz 했다.

소켓을 하나 만들고, 생성자로 소켓에다 static 소켓을 집어넣는다.

위에서 봤듯이 이건   밖에 생성 안하고, SocketClient 수정하지 않는 , 다른 방법으로 생성 못한다.

 

getSocketClient 호출하면 생성자에서 만들어진 소켓을 반환한다.

 

package com.company.design.singleton;

public class BClazz {

    private SocketClient socketClient;

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

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

BClazz 마찬가지다. 하나밖에 없는 소켓을 여기서도 생성자에서 집어넣고 반환한다.

 

package com.company.design;

import com.company.design.singleton.AClazz;
import com.company.design.singleton.BClazz;
import com.company.design.singleton.SocketClient;

public class Main {

    public static void main(String[] args) {

        AClazz aClazz = new AClazz();
        BClazz bClazz = new BClazz();

        SocketClient aClient = aClazz.getSocketClient();
        SocketClient bClient = bClazz.getSocketClient();

        System.out.println("두 객체가 동일한가?");
        System.out.println(aClient.equals(bClient));
    }
}

main에선 AClazz BClazz 인스턴스를 만드면서, 같은 객체를 집어넣게 된다.

 

결과 equals() 같은지 조회하면 같다고 나온다.

 

만약 싱글톤 방식이 아니라면, SocketClient객체를 따로 생성해서 다른 객체가 들어갈 것이다.

댓글