코딩 기록들

스프링 입문 2.1 싱글톤(singleton) 패턴 & 어댑터(adapter) 패턴 본문

스프링 입문

스프링 입문 2.1 싱글톤(singleton) 패턴 & 어댑터(adapter) 패턴

코딩펭귄 2023. 12. 26. 23:24

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();

    }
}