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객체를 따로 생성해서 다른 객체가 들어갈 것이다.
'자바' 카테고리의 다른 글
디자인 패턴 3. 프록시 패턴 (Proxy Pattern), AOP (0) | 2022.03.12 |
---|---|
디자인 패턴 2. 어댑터 패턴 (Adapter Pattern) (0) | 2022.03.11 |
디자인 패턴 (0) | 2022.03.10 |
객체지향 4. POJO JAVA, 마무리하며 (0) | 2022.03.10 |
객체지향 3. 객체지향 설계 5원칙 SOLID (0) | 2022.03.10 |
댓글