Facade Parttern이란?
복잡한 시스템이나 서브시스템을 단순하게 사용할 수 있는 인터페이스를 제공하는 구조적 디자인 패턴이다.
Façade는 프랑스어로 정면 외벽을 의미한다.
즉, 복잡한 내부 구조를 벽에 숨겨놓고 다 알지 않아도
단순하게 객체(인터페이스) 하나만으로도 시스템을 사용할 수 있게끔 도와주는 디자인 패턴이다.
Facade Pattern을 쓰는 이유(==기존 개발 형태에 대한 문제점)?
위키에도 올라와있는 예제(사용자가 퍼사드(컴퓨터)를 통해 컴퓨터 내부의 부품(CPU, HDD) 등을 접근한다는 내용의 추상적인 예제)를
퍼사드 패턴을 적용하기 전, 기존 개발 코드로 작성하면 어떨까? 다음과 같을 것이다.
서브 시스템을 구성하는 클래스들
public class CPU {
public void freeze() {
System.out.println("CPU is frozen");
}
public void jump(long position) {
System.out.println("Jumping to position " + position);
}
public void execute() {
System.out.println("Executing commands");
}
}
public class Memory {
public void load(long position, byte[] data) {
System.out.println("Loading data to position " + position);
}
}
public class HardDrive {
public byte[] read(long lba, int size) {
System.out.println("Reading data from LBA " + lba);
return new byte[size];
}
}
클라이언트가 직접 서브 시스템을 호출하는 방식
public class Client {
public static void main(String[] args) {
CPU cpu = new CPU();
Memory memory = new Memory();
HardDrive hardDrive = new HardDrive();
// 클라이언트가 서브시스템의 모든 세부 사항을 직접 호출하고 관리
cpu.freeze();
byte[] data = hardDrive.read(0x2000, 512);
memory.load(0x1000, data);
cpu.jump(0x1000);
cpu.execute();
}
}
문제점
- 복잡성 증가:
- 클라이언트가 서브시스템의 모든 세부 사항을 알아야 하므로 코드가 복잡해짐.
- 높은 결합도:
- 클라이언트와 서브시스템 간의 결합도가 높다. 예를 들어, CPU, Memory, HardDrive 클래스가 변경되면 클라이언트 코드도 수정해야함.
- 유지보수 어려움:
- 서브시스템의 변경이 클라이언트 코드에 영향을 미치므로 유지보수가 어려워짐.
Facade Pattern(퍼사드 패턴) 구현 방법
- 서브시스템(Sub-System) 클래스
- 퍼사드(Facade)
- 클라이언트(Client)
1. 서브시스템(Sub-System)
클래스 실제 작업을 수행하는 클래스들. 이 클래스들은 직접적으로 클라이언트에게 노출되지 않고, 퍼사드를 통해서만 접근됨.
public class CPU {
public void freeze() {
System.out.println("CPU is frozen");
}
public void jump(long position) {
System.out.println("Jumping to position " + position);
}
public void execute() {
System.out.println("Executing commands");
}
}
public class Memory {
public void load(long position, byte[] data) {
System.out.println("Loading data to position " + position);
}
}
public class HardDrive {
public byte[] read(long lba, int size) {
System.out.println("Reading data from LBA " + lba);
return new byte[size];
}
}
2. 퍼사드(Facade)
복잡한 서브시스템의 여러 인터페이스를 단순한 하나의 인터페이스로 제공함.
public class ComputerFacade {
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;
public ComputerFacade() {
this.cpu = new CPU();
this.memory = new Memory();
this.hardDrive = new HardDrive();
}
public void start() {
cpu.freeze();
memory.load(0x1000, hardDrive.read(0x2000, 512));
cpu.jump(0x1000);
cpu.execute();
}
}
3. 클라이언트(Client)
퍼사드 객체를 통해 서브시스템의 기능을 사용함.
public class Client {
public static void main(String[] args) {
ComputerFacade computer = new ComputerFacade();
computer.start();
}
}
- 서브시스템 클래스들: CPU, Memory, HardDrive 클래스들은 각각 복잡한 작업을 수행함.
- 퍼사드 클래스: ComputerFacade 클래스는 서브시스템 클래스들을 캡슐화하고, 클라이언트에게 단순한 인터페이스를 제공해 줌.
- 클라이언트: 클라이언트는 ComputerFacade를 통해 복잡한 서브시스템의 기능을 간단하게 사용할 수 있음.
다른 예제
내가 있는 현재 위치를 지도에서의 주소로 출력하기 위해서는 다음과 같은 기능들이 필요하다.
1. 내 위치를 가져오고,
2. 해당되는 위치가 지도상에서 어디인지 도로명이나 지번과 같은 문자열로 받아오고,
3. 받아온 문자열을 출력한다.
그럼 서브 시스템의 클래스는 다음과 같다.
// 1. 내 위치(위도, 경도)를 가져오는 것
public class GeoLocation {
public double[] getGeoLoc() {
double[] geoLoc = {0, 0};
return geoLoc;
}
}
// 2. 지도에서 해당 위치가 어디인지 문자열로 받아오는 것
public class InternetConnection {
public void connect() {};
public String getData(String url, Object param) {
return "";
}
public void disconnect() {};
}
// 3. 받아온 문자열을 출력하는 것
import java.util.HashMap;
import java.util.Map;
public class Json {
public Map<String, Object> parse(String str) {
Map<String, Object> result = new HashMap<>();
result.put("address", "서울시 개발구 객체동");
return result;
}
}
기존 클라이언트 코드
import java.util.Map;
public class OldPattern {
public static void main(String[] args) {
double[] myGeoLoc = new GeoLocation().getGeoLoc();
InternetConnection conn = new InternetConnection();
conn.connect();
String data = conn.getData("https://주소_API_URL", myGeoLoc);
conn.disconnect();
Map<String, Object> address = new Json().parse(data);
System.out.println(address.get("address"));
// 서울시 개발구 객체동
}
}
퍼사드 패턴
import java.util.Map;
public class MyLocFacade {
public void printMyAddress () {
double[] myGeoLoc = new GeoLocation().getGeoLoc();
InternetConnection conn = new InternetConnection();
conn.connect();
String data = conn.getData("https://주소_API_URL", myGeoLoc);
conn.disconnect();
Map<String, Object> address = new Json().parse(data);
System.out.println(address.get("address"));
}
}
public class FacadePattern {
public static void main(String[] args) {
new MyLocFacade().printMyAddress();
// 서울시 개발구 객체동
}
}
Facade Pattern의 장단점
장점
- 사용성 향상:
- 클라이언트가 복잡한 서브시스템을 쉽게 사용할 수 있도록 해줌.
- 결합도 감소(== 의존성 감소):
- 클라이언트와 서브시스템 간의 결합도를 낮춰서, 시스템의 변경이 클라이언트에 미치는 영향을 줄여줌.
- 코드의 가독성 및 유지보수성 향상:
- 코드의 가독성과 유지보수성을 향상시킴.
단점
- 추가된 추상화:
- 퍼사드가 모든 기능을 제공하지 않을 수 있으며, 특정 기능을 사용하려면 여전히 서브시스템에 직접 접근해야 할 수도 있음.
- 복잡성 증가:
- 시스템의 복잡도가 매우 낮은 경우, 퍼사드를 도입하면 오히려 복잡성이 증가할 수 있음.
퍼사드 패턴의 실제 사용 사례
- 라이브러리 및 프레임워크:
- 복잡한 라이브러리나 프레임워크의 기능을 단순화된 인터페이스로 제공하여 사용성을 높임.
- API 디자인:
- 복잡한 API를 단순화된 인터페이스로 제공하여, 개발자가 쉽게 사용할 수 있도록 함.
- 모듈화된 시스템:
- 큰 시스템을 모듈화하고, 각 모듈의 복잡한 내부 구현을 감추기 위해 퍼사드를 사용함.
참조
https://www.youtube.com/watch?v=q3_WXP9pPUQ
'CS > 디자인패턴' 카테고리의 다른 글
[Design Pattern] Composite Pattern(컴포지트 패턴) (0) | 2024.06.06 |
---|---|
[Design Pattern] Decorator Pattern(데코레이터 패턴) (0) | 2024.06.05 |
[Design Pattern] Proxy Pattern(프록시 패턴) (0) | 2024.06.03 |
[Design Pattern] Strategy Pattern(전략 패턴) (0) | 2024.06.02 |
[Design Pattern] Factory Pattern(팩토리 패턴) (0) | 2024.06.01 |
Facade Parttern이란?
복잡한 시스템이나 서브시스템을 단순하게 사용할 수 있는 인터페이스를 제공하는 구조적 디자인 패턴이다.
Façade는 프랑스어로 정면 외벽을 의미한다.
즉, 복잡한 내부 구조를 벽에 숨겨놓고 다 알지 않아도
단순하게 객체(인터페이스) 하나만으로도 시스템을 사용할 수 있게끔 도와주는 디자인 패턴이다.
Facade Pattern을 쓰는 이유(==기존 개발 형태에 대한 문제점)?
위키에도 올라와있는 예제(사용자가 퍼사드(컴퓨터)를 통해 컴퓨터 내부의 부품(CPU, HDD) 등을 접근한다는 내용의 추상적인 예제)를
퍼사드 패턴을 적용하기 전, 기존 개발 코드로 작성하면 어떨까? 다음과 같을 것이다.
서브 시스템을 구성하는 클래스들
public class CPU {
public void freeze() {
System.out.println("CPU is frozen");
}
public void jump(long position) {
System.out.println("Jumping to position " + position);
}
public void execute() {
System.out.println("Executing commands");
}
}
public class Memory {
public void load(long position, byte[] data) {
System.out.println("Loading data to position " + position);
}
}
public class HardDrive {
public byte[] read(long lba, int size) {
System.out.println("Reading data from LBA " + lba);
return new byte[size];
}
}
클라이언트가 직접 서브 시스템을 호출하는 방식
public class Client {
public static void main(String[] args) {
CPU cpu = new CPU();
Memory memory = new Memory();
HardDrive hardDrive = new HardDrive();
// 클라이언트가 서브시스템의 모든 세부 사항을 직접 호출하고 관리
cpu.freeze();
byte[] data = hardDrive.read(0x2000, 512);
memory.load(0x1000, data);
cpu.jump(0x1000);
cpu.execute();
}
}
문제점
- 복잡성 증가:
- 클라이언트가 서브시스템의 모든 세부 사항을 알아야 하므로 코드가 복잡해짐.
- 높은 결합도:
- 클라이언트와 서브시스템 간의 결합도가 높다. 예를 들어, CPU, Memory, HardDrive 클래스가 변경되면 클라이언트 코드도 수정해야함.
- 유지보수 어려움:
- 서브시스템의 변경이 클라이언트 코드에 영향을 미치므로 유지보수가 어려워짐.
Facade Pattern(퍼사드 패턴) 구현 방법
- 서브시스템(Sub-System) 클래스
- 퍼사드(Facade)
- 클라이언트(Client)
1. 서브시스템(Sub-System)
클래스 실제 작업을 수행하는 클래스들. 이 클래스들은 직접적으로 클라이언트에게 노출되지 않고, 퍼사드를 통해서만 접근됨.
public class CPU {
public void freeze() {
System.out.println("CPU is frozen");
}
public void jump(long position) {
System.out.println("Jumping to position " + position);
}
public void execute() {
System.out.println("Executing commands");
}
}
public class Memory {
public void load(long position, byte[] data) {
System.out.println("Loading data to position " + position);
}
}
public class HardDrive {
public byte[] read(long lba, int size) {
System.out.println("Reading data from LBA " + lba);
return new byte[size];
}
}
2. 퍼사드(Facade)
복잡한 서브시스템의 여러 인터페이스를 단순한 하나의 인터페이스로 제공함.
public class ComputerFacade {
private CPU cpu;
private Memory memory;
private HardDrive hardDrive;
public ComputerFacade() {
this.cpu = new CPU();
this.memory = new Memory();
this.hardDrive = new HardDrive();
}
public void start() {
cpu.freeze();
memory.load(0x1000, hardDrive.read(0x2000, 512));
cpu.jump(0x1000);
cpu.execute();
}
}
3. 클라이언트(Client)
퍼사드 객체를 통해 서브시스템의 기능을 사용함.
public class Client {
public static void main(String[] args) {
ComputerFacade computer = new ComputerFacade();
computer.start();
}
}
- 서브시스템 클래스들: CPU, Memory, HardDrive 클래스들은 각각 복잡한 작업을 수행함.
- 퍼사드 클래스: ComputerFacade 클래스는 서브시스템 클래스들을 캡슐화하고, 클라이언트에게 단순한 인터페이스를 제공해 줌.
- 클라이언트: 클라이언트는 ComputerFacade를 통해 복잡한 서브시스템의 기능을 간단하게 사용할 수 있음.
다른 예제
내가 있는 현재 위치를 지도에서의 주소로 출력하기 위해서는 다음과 같은 기능들이 필요하다.
1. 내 위치를 가져오고,
2. 해당되는 위치가 지도상에서 어디인지 도로명이나 지번과 같은 문자열로 받아오고,
3. 받아온 문자열을 출력한다.
그럼 서브 시스템의 클래스는 다음과 같다.
// 1. 내 위치(위도, 경도)를 가져오는 것
public class GeoLocation {
public double[] getGeoLoc() {
double[] geoLoc = {0, 0};
return geoLoc;
}
}
// 2. 지도에서 해당 위치가 어디인지 문자열로 받아오는 것
public class InternetConnection {
public void connect() {};
public String getData(String url, Object param) {
return "";
}
public void disconnect() {};
}
// 3. 받아온 문자열을 출력하는 것
import java.util.HashMap;
import java.util.Map;
public class Json {
public Map<String, Object> parse(String str) {
Map<String, Object> result = new HashMap<>();
result.put("address", "서울시 개발구 객체동");
return result;
}
}
기존 클라이언트 코드
import java.util.Map;
public class OldPattern {
public static void main(String[] args) {
double[] myGeoLoc = new GeoLocation().getGeoLoc();
InternetConnection conn = new InternetConnection();
conn.connect();
String data = conn.getData("https://주소_API_URL", myGeoLoc);
conn.disconnect();
Map<String, Object> address = new Json().parse(data);
System.out.println(address.get("address"));
// 서울시 개발구 객체동
}
}
퍼사드 패턴
import java.util.Map;
public class MyLocFacade {
public void printMyAddress () {
double[] myGeoLoc = new GeoLocation().getGeoLoc();
InternetConnection conn = new InternetConnection();
conn.connect();
String data = conn.getData("https://주소_API_URL", myGeoLoc);
conn.disconnect();
Map<String, Object> address = new Json().parse(data);
System.out.println(address.get("address"));
}
}
public class FacadePattern {
public static void main(String[] args) {
new MyLocFacade().printMyAddress();
// 서울시 개발구 객체동
}
}
Facade Pattern의 장단점
장점
- 사용성 향상:
- 클라이언트가 복잡한 서브시스템을 쉽게 사용할 수 있도록 해줌.
- 결합도 감소(== 의존성 감소):
- 클라이언트와 서브시스템 간의 결합도를 낮춰서, 시스템의 변경이 클라이언트에 미치는 영향을 줄여줌.
- 코드의 가독성 및 유지보수성 향상:
- 코드의 가독성과 유지보수성을 향상시킴.
단점
- 추가된 추상화:
- 퍼사드가 모든 기능을 제공하지 않을 수 있으며, 특정 기능을 사용하려면 여전히 서브시스템에 직접 접근해야 할 수도 있음.
- 복잡성 증가:
- 시스템의 복잡도가 매우 낮은 경우, 퍼사드를 도입하면 오히려 복잡성이 증가할 수 있음.
퍼사드 패턴의 실제 사용 사례
- 라이브러리 및 프레임워크:
- 복잡한 라이브러리나 프레임워크의 기능을 단순화된 인터페이스로 제공하여 사용성을 높임.
- API 디자인:
- 복잡한 API를 단순화된 인터페이스로 제공하여, 개발자가 쉽게 사용할 수 있도록 함.
- 모듈화된 시스템:
- 큰 시스템을 모듈화하고, 각 모듈의 복잡한 내부 구현을 감추기 위해 퍼사드를 사용함.
참조
https://www.youtube.com/watch?v=q3_WXP9pPUQ
'CS > 디자인패턴' 카테고리의 다른 글
[Design Pattern] Composite Pattern(컴포지트 패턴) (0) | 2024.06.06 |
---|---|
[Design Pattern] Decorator Pattern(데코레이터 패턴) (0) | 2024.06.05 |
[Design Pattern] Proxy Pattern(프록시 패턴) (0) | 2024.06.03 |
[Design Pattern] Strategy Pattern(전략 패턴) (0) | 2024.06.02 |
[Design Pattern] Factory Pattern(팩토리 패턴) (0) | 2024.06.01 |