본문 바로가기
까망 동네/디자인 패턴

[디자인패턴] 퍼사드 패턴 (Facade Pattern)

by 까망 하르방 2023. 11. 9.
반응형

🎈 퍼사드 패턴 (Facade Pattern) 

• 복잡한 시스템을 단순화된 인터페이스를 제공하여

  사용자가 시스템 일부분을 쉽게 사용할 수 있도록 한다.

• 디자인 패턴 중 구조 패턴에 해당된다.

 

💻 디자인 패턴(Design Pattern)이란?

👨‍💻 디자인 패턴(Design Pattern)이란? • SW 개발 방법 중에서도 구조적인 문제 해결에 목적을 둔다. • 알고리즘과 같이 특정 문제를 해결하는 Logic 형태보다는 특정 상황에 적용할 수 있는 방

zoosso.tistory.com

 

 

활용 방안

 복잡한 시스템 단순화

 라이브러리 래핑: 외부 라이브러리 or API를 이용하여 사용자 친화적인 인터페이스 제공

 기능 묶기: 서브 시스템을 논리적으로 묶어서 일관된 인터페이스 제공

 

 

[예제 코드]

#include <iostream>

class CPU {
public:
    void start() {
        std::cout << "CPU 시작" << std::endl;
    }

    void shutdown() {
        std::cout << "CPU 종료" << std::endl;
    }
};

class Memory {
public:
    void load() {
        std::cout << "Memory 로딩" << std::endl;
    }

    void free() {
        std::cout << "Memory 종료" << std::endl;
    }
};

class PowerSupply {
public:
    void turnOn() {
        std::cout << "전원 공급 ON" << std::endl;
    }

    void turnOff() {
        std::cout << "전원 공급 OFF" << std::endl;
    }
};

class ComputerFacade {
private:
    CPU cpu;
    Memory memory;
    PowerSupply powerSupply;

public:
    void startComputer() {
        std::cout << "---Start computer---" << std::endl;
        powerSupply.turnOn();
        memory.load();
        cpu.start();
        std::cout << "---Computer started successfully---\n" << std::endl;
    }

    void shutdownComputer() {
        std::cout << "---Shut down computer---" << std::endl;
        cpu.shutdown();
        memory.free();
        powerSupply.turnOff();
        std::cout << "---Computer shutdown completed---" << std::endl;
    }
};

int main() {
    ComputerFacade computer;

    // 컴퓨터 켜기
    computer.startComputer();

    // 컴퓨터 끄기
    computer.shutdownComputer();

    return 0;
}

 

 

이 컴퓨터는 여러 하위 시스템(전원, 메모리, CPU 등)으로 구성되어 있다.

CPU, Memory, PowerSupply와 같은 서브 시스템 클래스가

컴퓨터를 켜고 끄는 과정에서 복합적으로 동작한다.

ComputerFacade 클래스로 컴퓨터를 켜고 끄는 작업을 단순화 하였다.


 

🎈 퍼사드 패턴 장단점

+ 단순한 인터페이스 제공: 복잡한 시스템 또는 서브 시스템 래핑

 → 클라이언트 코드는 시스템의 복잡성을 숨길 수 있다.

+ 의존성 관리: 클라이언트는 퍼사드 클래스만 의존하면 되기에 강한 결합 방지

 

- 유연성 감소: 퍼사드 클래스 외 접근할 수 없으므로

 특정 기능을 직접 사용하고자 할 때 유연성이 감소할 수 있다.

- 성능 오버헤드: 메서드 호출이 퍼사드 클래스를 통해 이루어지기에 성능 오버헤드가 발생할 수 있다.

 

[예제 코드]

#include <iostream>

class GraphicsBuffer {
public:
    void create() {
        std::cout << "그래픽 버퍼 생성" << std::endl;
    }
};

class RenderingEngine {
public:
    void render() {
        std::cout << "그래픽 랜더링" << std::endl;
    }
};

class AudioSystem {
public:
    void playSound() {
        std::cout << "오디오 재생" << std::endl;
    }
};

// 그래픽 라이브러리 퍼사드 클래스
class GraphicsLibraryFacade {
private:
    GraphicsBuffer buffer;
    RenderingEngine renderer;
    AudioSystem audio;

public:
    void initialize() {
        buffer.create();
        renderer.render();
        audio.playSound();
    }
};

int main() {
    // 퍼사드 패턴 적용 X
    GraphicsBuffer buffer;
    RenderingEngine renderer;
    AudioSystem audio;

    buffer.create();
    renderer.render();
    audio.playSound();

    puts("----------------------------------------");
    // 그래픽 라이브러리 초기화 (by. 퍼사드 클래스)
    GraphicsLibraryFacade graphicsLibrary;
    graphicsLibrary.initialize();

    return 0;
}

 

 

퍼사드 패턴을 적용하지 않는다면 직접적으로 메서드를 호출하지만

GraphicsLibraryFacade 클래스로 서브 시스템을 단순화 할 수 있다.

 

클라이언트는 입장에서는 퍼사트 클래스를 사용하여

그래픽 라이브러리 초기화 및 작업 가능

반응형

댓글