Facade Design [팩토리 디자인]
Design Object [디자인목적]
- 복잡하고 변경이 잦은 API 나 하위 시스템을 갖는 설계 할때, 하나의 추상화된 인터페이스를 제공하고자 할때 적용
Options [대안들]
호출 시스템에 매번 API나 호출 시스템이 변경될 때 추가한다
-> 확장성이 떨어지며, 기능이 추가되거나 변경 시 시스템 전반적으로 수정해야한다.
Benefit [디자인 장점]
서브시스템을 추상화 하므로, 호출 시스템에서는 모든 서브시스템을 알 필요가 없다.
따라서 프로그램 변경 시 수정할 부분이 적다.
Structure & Sample Code [구조와 샘플코드]
1) 빌링과 송장을 만드는 시스템
UML
서브시스템을 파사드가 추상화 시켜준다. 즉, 서브시스템이 변경되어도 클라이언트(호출객체)는 파사드만 바라보면 하위 시스템을 쉽게 호출할 수 있다.구조
-> 빌링 객체가 생성되면 송장 객체를 만든다.
-> 빌링객체와 송장 객체는 별도의 시스템에 존재하며, 클라이언트 시스템에서 두 시스템을 호출한다
-> 클라이언트 시스템은 빌링과 송장생성을 위해 빌링 시스템과 송장시스템의 메소드를 호출하여야 한다.Facade design
-> 클라이언트 시스템에서 빌링시스템과 송장 시스템을 추상화 시키기 위해 이 두 시스템을 추상화한 파사드 시스템을 만든다.
-> 파사드를 중간에 놓음으로써, 클라이언트는 파사드에만 접근하면 된다.
1)Financial Facade
// 빌링시스템과 송장시스템을 추상화
// 두 시스템의 접근을 위해, 두 시스템(객체)의 제어 메소드 추가
public class FinialSystemFacade {
private BillingSystem billingSystem;
private InvoiceCustomerSystem invoiceSystem;
public void createInvoice(Integer amount){
Bill bill = new Bill(amount);
invoiceSystem.createInvoiceForBill(bill);
}
public void setBillingSystem(BillingSystem billingSystem){
this.billingSystem = billingSystem;
}
public void setInvoiceSystem(InvoiceCustomerSystem invoiceSystem){
this.invoiceSystem = invoiceSystem;
}
}
2) 빌링 객체와 빌링 시스템(SUBSYSTEM)
// Bill 객체
public class Bill {
private Integer amt;
public Bill(Integer amt){
this.amt = amt;
}
public Integer getAmount(){ return amt; }
}
// Bill 객체를 제어하는 빌링 시스템
public class BillingSystem {
public Bill createBill(Integer amt){
return new Bill(amt);
}
}
3) 송장시스템(SUBSYSTEM)
// 송장시스템 객체
public class InvoiceCustomerSystem {
public void createInvoiceForBill(Bill bill){
System.out.println("Bill info : " + bill.getAmount());
}
}
4) fasade를 통해 추상화된 서브시스템 호출
public class Client {
public static void main(String[] args) {
/**
* 호출할 서브시스템의 객체 생성
*/
BillingSystem billingSystem = new BillingSystem();
InvoiceCustomerSystem invoice = new InvoiceCustomerSystem();
/**
* Facade 생성
*/
FinialSystemFacade finialSystemFacade = new FinialSystemFacade();
//Facade를 통한 Bill 및 BillingSystem 생성
finialSystemFacade.setBillingSystem(billingSystem);
finialSystemFacade.setInvoiceSystem(invoice);
// Facade를 통한 송장생성
finialSystemFacade.createInvoice(300000);
}
}