[Design Pattern] Facade Pattern (퍼사드 패턴)

bagt13·2023년 2월 6일
2

Architecture

목록 보기
1/1
post-thumbnail

📒 Facade Pattern이란?

퍼사드 패턴(Facade Pattern)은 구조 패턴(Structural Pattern)의 한 종류로써, 복잡한 서브 클래스들의 공통적인 기능을 정의하는 상위 수준의 인터페이스를 제공하는 패턴이다.

  • 퍼사드 객체(Facade Object)서브 클래스의 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 간단히 사용 할 수 있게 간단한 인터페이스를 제공해준다.

  • 퍼사드 패턴을 통해 서브 시스템(SubSystem)들 간의 종속성을 줄여줄 수 있으며, 퍼사드 객체를 사용하는 곳(Client)에서는 여러 서브 클래스들을 호출할 필요 없이 편리하게 사용할 수 있다.


📒 그림으로 보는 Facade Pattern

여러 SubSystem들의 기능을 하나의 Facade Object로 정의하고, Client가 Facade Object를 사용하는 형태이다.



📘 예시

예를 들어, 세탁이라는 행위에 Facade Pattern을 적용시켜보자.

세탁를 하기 위해서는 크게 Washing, Rinsing, Spinning과 같은 동작들이 필요하다. 이들은 SubSystem들로써, Facade Object를 통해 '세탁'이라는 행위에 필요한 공통 기능들을 정의할 수 있다.


📒 기존의 코드 (Facade Pattern 미적용)

Washing

class Rinsing{
    void rinse(){
        System.out.println("do Rinsing")
    }
}

Rinsing

class Spinning{
    void spin(){
        System.out.println("do Spinning")
    }
}

Spinning

class Washing{
    void wash(){
        System.out.println("do Washing")
    }
}

Client (sub class 사용 객체)

class Client{
	Washing washing = new Washing();
    Rinsing rinsing = new Rinsing();
    Spinning spinning = new Spinning();
    
    washing.wash();
    rinsing.rinse();
    spinning.spin();
}

읽기가 힘든 코드이며, 유지보수에 용이하지 않다. Client가 여러 객체들에 강하게 결합되어 있다.



📒 Facade Pattern 적용

WashingMachine

class WashingMachine{

    Washing washing = new Washing();
    Rinsing rinsing = new Rinsing();
    Spinning spinning = new Spinning();

	void startWashing(){
    	washing.wash();
        rinsing.rinse();
        spinning.spin();
    }
}

Client

class Client{
    WashingMachine washingMachine = new WashingMachine();
    washingMachine.strartWahsing();
}

Client에서는 Facade Object(WashingMachine)만을 호출하여 '세탁'이라는 동작을 수행할 수 있으며, 메서드의 의미 또한 명확하게 알 수 있다.



📒 Facade Pattern의 장점

  • 낮은 결합도
    Client가 서브 시스템(SubSystem)들의 코드를 몰라도 된다. Facade Object만 알면 사용이 가능하다. 또한 서브 시스템들간의 복잡한 결합도 역시 낮출 수 있다.

  • 가독성 상승
    기존에는 Client에서 여러 서브 클래스들을 직접 호출해야 했다.
    하지만 Facade Pattern을 사용하면 하나의 객체만을 호출하여 사용할 수 있고, 그 객체의 네이밍 역시 간단명료할 수밖에 없다.

  • 서브 시스템 직접 접근 가능
    필요에 따라 서브 클래스를 직접 사용할 수도 있다. 선택지가 많아짐.


📃 Reference

profile
주니어 백엔드 개발자입니다😄

0개의 댓글