코딩 기록들
스프링 입문 2.1 싱글톤(singleton) 패턴 & 어댑터(adapter) 패턴 본문
Singleton pattern
- 어떤 클래스(객체)가 유일하게 1개만 존재해야 할 때 사용
- 서로 자원을 공유할 때 주로 사용
- 실물세계에서는 여러개의 pc가 하나의 '프린터기'에 연결된것이 해당됨 / 실제프로그래밍에서는 TCP Socket통신에서 서버와 연결된 하나의 connect 객체
- 디폴트 생성자 : private
- get instance()통해 생성되어있는 객체 가지고오거나, 없다면 새로 생성
package com.company.design.singleton;
public class SocketClient {
//싱글톤 = 자기자신을 객체로 가지고 있어야함
private static SocketClient socketClient = null;
// 싱글톤 = 기본생성자를 private으로 막아야됨
private SocketClient(){ //default생성자 private로 반드시!
}
public static SocketClient getInsatnce(){
if(socketClient == null){ //호출했을때 없는(null)경우 생성
socketClient = new SocketClient();
}
//호출했을때 있는경우 자신이 가지고있는 socketClient 리턴
return socketClient;
}
public void connect(){
System.out.println("connect");
}
}
package com.company.design.singleton;
public class AClazz {
private SocketClient socketClient;
public AClazz(){
this.socketClient = SocketClient.getInsatnce();
//this.socketClient = new SocketClient(); 이렇게 new를 사용해서 socketClient를 직접 생성하면
// main 코드에서 8번째 줄인 default생성자를 public으로 한다면,
// aClient 와 bClient의 값은 다름! eqials로 비교시 false 출력됨
}
public SocketClient getSocketClient(){
return this.socketClient;
}
package com.company.design.singleton;
public class BClazz {
private SocketClient socketClient;
//디폴트생성자, 초기화
public BClazz(){
this.socketClient = SocketClient.getInsatnce();
}
public SocketClient getSocketClient(){
return this.socketClient;
}
}
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)); // 두 객체가 서로 동일한지 비교 -> 동일하면 true 반환
}
}
Adapter pattern
- 변환기(돼지코)의 역할을 함
- 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 함
- SOLID 중 개방폐쇄원칙(OCP)을 따름
1) 인터페이스 구성
public interface Electronic110V {
//전원을 줌
void powerOn();
}
public interface Electronic220V {
void connect();
}
2) 전자기기 클래스 구성
public class AirConditioner implements Electronic220V{
@Override
public void connect() {
System.out.println("에어컨 220V on");
}
}
public class Cleaner implements Electronic220V{
@Override
public void connect() {
System.out.println("청소기 220V on");
}
}
public class HairDryer implements Electronic110V{
@Override
public void powerOn() {
System.out.println("헤어드라이기 110V on");
}
}
3) 어댑터
public class SocketAdapter implements Electronic110V {
//220 -> 110으로 만들어주는 역할
private Electronic220V electronic220V;
public SocketAdapter(Electronic220V electronic220V){
this.electronic220V = electronic220V;
}
@Override
public void powerOn() {
//110v에 220v가 할당되었을때, 220v를 connect해주는것
electronic220V.connect();
}
}
4) 메인코드
public class Main {
public static void main(String[] args) {
HairDryer hairDryer = new HairDryer();
connect(hairDryer);
Cleaner cleaner = new Cleaner();
Electronic110V adapter = new SocketAdapter(cleaner); //220v짜리를 받는 형태
connect(adapter);//adapter를 통해서 cleaner에 연결
//connect(cleaner);
//connect는 110v를 받으므로, 220v를 110v로 변환시켜줘야함
AirConditioner airConditioner = new AirConditioner();
//220v위에 110 어댑터 끼우는것
Electronic110V airAdapter = new SocketAdapter(airConditioner);
connect(airAdapter);
}
//110v만 받아서 전원킬 수 있는 <콘센트>
public static void connect(Electronic110V electronic110V){
electronic110V.powerOn();
}
}
'스프링 입문' 카테고리의 다른 글
스프링 입문 2.3 옵저버(Observer), 파사드(facade), 전략(strategy) 패턴 (0) | 2023.12.31 |
---|---|
스프링 입문 2.2 프록시(Proxy), 데코레이터(Decorator) 패턴 (0) | 2023.12.30 |
스프링 입문 2. 디자인패턴이란? (2) | 2023.12.26 |
스프링 입문 1.3 POJO JAVA (1) | 2023.12.26 |
스프링 입문 1.2 객체지향 설계 5원칙 (0) | 2023.12.26 |