SpringBoot/Java

22.03.22

함형우 2022. 3. 22. 18:11
728x90

생성 패턴

객체를 생성하는 것과 관련된 패턴, 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화 코드의 유연성을 상승


구조 패턴

프로그램 내의 자료구조, 인터페이스 구조 등 프로그램 구조를 설계하는데 활용 될 수 있는 패턴

큰 규모의 시스템에서는 많은 클래스들이 서로 의존성을 가지게 되는데, 이런 복잡한 구조를 개발하기 쉽게 만들어 주고 유지 보수 하기 쉽게 만들어 준다.


행위 패턴

반복적으로 사용되는 객체들의 상호작용을 패턴화, 상호작용하는 방법과 책임을 분산화


싱글톤 패턴

객체가 유일하게 1개만 존재 할 때 사용 서로 자원을 공유 할 때 사용함, 예를 들어 프린터가 해당되며, 실제 프로그래밍에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용함

 

 

package com.company.Desgin.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");
    }

}

public class BClass {

    private SocketClient socketClient;

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

public class AClass {

    private SocketClient socketClient;

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

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

import com.company.Desgin.singleton.AClass;
import com.company.Desgin.singleton.BClass;
import com.company.Desgin.singleton.SocketClient;

public class Main {

    public static void main(String[] args) {

        AClass aClass = new AClass();
        BClass bClass = new BClass();

        SocketClient aClent = aClass.getSocketClient();
        SocketClient bClent = bClass.getSocketClient();

        System.out.println("두개의 객체가 동일합니까?");
        System.out.println(aClent.equals(bClent)); 
    }
}

각 클래스에서 개별적으로, private를 주지 않고 public으로 뚫어 놓는다면,

 

this.socketClient = new SocketClient();

 

를 사용한다면, 두 객체는 동일하지 않는다. 이렇게 된다면 하나의 객체만을 사용하는 싱글톤 패턴과는 맞지 않게된다.


어댑터 패턴

 

예를 들면 변환기, 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용 할 수 있도록 하는 패턴

 

package com.company.Desgin;

import com.company.Desgin.adapter.Cleaner;
import com.company.Desgin.adapter.Electronic110V;
import com.company.Desgin.adapter.HairDryer;

public class Main {

    public static void main(String[] args) {

        HairDryer hairDryer = new HairDryer();
        connect(hairDryer);

        Cleaner cleaner = new Cleaner(); // 220V 를 사용하기 때문에 오류가 뜸
        connect(cleaner);
    }

    public static void connect(Electronic110V electronic110V){
        electronic110V.powerOn();
    }
}

 

110V를 불러들여 코드를 실행시켰기 때문에, 220V를 사용하는 청소기는 작동이 되지 않는다, 이를 해결하기 위해서

 

 

package com.company.Desgin.adapter;

public class SocketAdapter implements Electronic110V{

    private Electronic220V electronic220V;

    public SocketAdapter(Electronic220V electronic220V){
        this.electronic220V = electronic220V;
    }
    @Override
    public void powerOn() {
        electronic220V.connect();
    }
}

 

위 코드처럼 호환 가능한 클래스를 만들어

 

        Cleaner cleaner = new Cleaner();
        Electronic110V adapter = new SocketAdapter(cleaner);
        connect(adapter);

 

적용 시켜주면 정상적으로 작동한다.


 

프록시 패턴

 

대리인이라는 뜻으로써, 무언가를 대신해서 처리하는 것 Cache의 기능으로도 활용 가능

 

 

 

728x90