computer science
Facade 패턴
sundotcom
2025. 4. 27. 14:57
Facade Pattern
structural design pattern that provides a simplified interface to a library, a framework, or any other complex set of classes
refactoring.guru
Problem
라이브러리나 프레임워크를 이용해 코드를 작성한다고 해보자. 이런 경우 보통은 객체를 직접 초기화하고, 객체의 의존성을 직접 관리하고, 호출 순서까지 신경써야 한다.
이렇게 되면 내가 작성하려고 하는 비즈니스 로직이 3rd party 라이브러리와 강하게 결합되게 되고, 코드릴 이해하거나 유지보수하기 어렵게 만든다.
Solution
- Facade 패턴은 많은 구성 요소를 가진 subsystem에 간단한 인터페이스를 제공하는 클래스
- subsystem의 코드를 직접 다루는 것보다는 제한적일 수는 있지만, 클라이언트가 실제로 필요로하는 기능만 노출할 수 있음
- 수십가지 기능을 가진 복잡한 라이브러리를 통합해야 할 때 유용함
- Facade
- subsystem 기능의 일부분만을 편리하게 접근할 수 있게 하는 인터페이스
- Additional Facade
- 하나의 facade 클래스가 서로 관계 없는 기능들로 복잡해지지 않게 분리
- client, 다른 facade에서 사용 가능
- Complex Subsystem
- 복잡한 라이브러리나 프레임워크 코드들의 집합
- Client
- subsystem 객체를 직접 호출하는 대신 facade 객체를 호출
코드
/* Subsystem: 비디오 인코딩/디코딩 복잡한 클래스 */
class VideoConverter {
public void decode(VideoFile file, Codec codec) {
//복잡한 디코딩
}
public void encode(VideoFile file, Codec codec) {
//복잡한 인코딩
}
}
class VideoFile {
private String filename;
public VideoFile(String filename) { this.filename = filename; }
public String getFilename() { return filename; }
}
class Codec { }
class MPEG4Codec extends Codec { }
class MovCodec extends Codec { }
/* Facade Class */
class VideoConversionFacade {
private VideoConverter converter = new VideoConverter();
public void convertVideo(String filename, String format) {
VideoFile file = new VideoFile(filename);
Codec codec;
if (format.equals("mp4")) {
codec = new MPEG4Codec();
} else if (format.equals("mov")) {
codec = new MovCodec();
} else {
throw new IllegalArgumentException("지원하지 않는 포맷");
}
converter.decode(file, codec);
converter.encode(file, codec);
System.out.println("비디오 변환 완료");
}
}
/* Client */
public class Client {
public static void main(String[] args) {
VideoConversionFacade converter = new VideoConversionFacade();
converter.convertVideo("video1", "mp4");
converter.convertVideo("video2", "mov");
}
}
Pros and Cons
- Pros
- 복잡한 subsystem에서 필요한 기능만 선별하여 인터페이스를 제공해서 분리할 수 있음
- Cons
- 모든 애플리케이션 클래스와 결합된 God Object가 될 수도 있음
- (너무 많은 책임을 갖고 있어 복잡도도 높아지고 유지보수도 어려워지는 큰 객체)