본문 바로가기

설계

[디자인 패턴] 퍼사드 패턴 (Facade Pattern) - python 예제 코드

퍼사드 패턴은 객체 지향 디자인 패턴 중 하나로, 서브시스템의 복잡성을 감소시키기 위해 사용됩니다. 이 패턴은 간단한 인터페이스를 제공하여 서브시스템의 복잡성을 숨기고, 클라이언트와 서브시스템 간의 상호작용을 간소화합니다.

 

1. 설명


간단한 예를 들어보겠습니다. 가정용 전기 제품을 다루는 프로그램을 개발한다고 가정해봅시다. 이 프로그램에는 다양한 전기 제품이 있고, 각 제품에 대한 제어를 위해 해당 제품의 클래스를 만들어야 합니다. 예를 들어, 전등 클래스, 토스터 클래스, 에어컨 클래스 등이 있을 수 있습니다. 이러한 클래스를 모두 다루는 것은 복잡하고 번거로울 수 있습니다. 이런 경우, 퍼사드 패턴을 사용하여 해당 클래스들을 간단한 인터페이스로 숨길 수 있습니다.

 

2. 예제 코드

 

다음은 파이썬 코드 예제입니다.

 

# 서브시스템 클래스들
class Light:
    def turn_on(self):
        print("전등을 켭니다.")

    def turn_off(self):
        print("전등을 끕니다.")

class AirConditioner:
    def turn_on(self):
        print("에어컨을 켭니다.")

    def turn_off(self):
        print("에어컨을 끕니다.")

class Television:
    def turn_on(self):
        print("TV를 켭니다.")

    def turn_off(self):
        print("TV를 끕니다.")

# 퍼사드 클래스
class HomeFacade:
    def __init__(self):
        self.light = Light()
        self.air_conditioner = AirConditioner()
        self.television = Television()

    def go_to_sleep(self):
        self.light.turn_off()
        self.air_conditioner.turn_off()
        self.television.turn_off()

    def wake_up(self):
        self.light.turn_on()
        self.air_conditioner.turn_on()
        self.television.turn_on()

# 클라이언트 코드
facade = HomeFacade()
facade.wake_up()
facade.go_to_sleep()


위 코드에서 HomeFacade 클래스는 퍼사드 역할을 합니다. HomeFacade 클래스의 인스턴스를 만들어서 wake_up() 메서드와 go_to_sleep() 메서드를 호출하면, 각각의 메서드에서는 Light, AirConditioner, Television 클래스의 객체를 생성하고, 해당 객체의 turn_on() 또는 turn_off() 메서드를 호출하여 각 전기 제품을 제어합니다.

클라이언트 코드에서는 HomeFacade 클래스의 인스턴스를 만들어서 wake_up() 메서드와 go_to_sleep() 메서드를 호출하는 것으로 전기 제품을 제어하는 복잡한 로직을 숨길 수 있습니다. 클라이언트는 단순히 HomeFacade 클래스의 인스턴스를 만들어서 메서드를 호출하면 됩니다.


3. 장점

  • 간단한 인터페이스를 제공하여 복잡한 시스템을 숨길 수 있습니다.
  • 서브시스템 간의 상호작용을 간소화하여 유지보수성을 향상시킵니다.
  • 클라이언트 코드의 복잡성을 줄일 수 있습니다.

4. 단점

  • 시스템을 단순화하는 대신, 시스템의 일부 기능을 제한할 수 있습니다.
  • 서브시스템 클래스들의 변경이 일어날 경우, 퍼사드 클래스도 수정해야 할 수 있습니다.
  • 추가적인 퍼사드 클래스가 필요한 경우, 시스템의 구조가 복잡해질 수 있습니다.

 

따라서, 퍼사드 패턴은 시스템을 단순화하고 유지보수성을 향상시키는 장점이 있지만, 제한적인 기능과 클래스 변경에 대한 유연성 부족 등의 단점이 있습니다. 따라서 패턴을 적용할 때는 장단점을 고려하여 적절하게 사용해야 합니다.