Facade Design [팩토리 디자인]

  1. Design Object [디자인목적]

    1. 복잡하고 변경이 잦은 API 나 하위 시스템을 갖는 설계 할때, 하나의 추상화된 인터페이스를 제공하고자 할때 적용
  2. Options [대안들]

    1. 호출 시스템에 매번 API나 호출 시스템이 변경될 때 추가한다

      -> 확장성이 떨어지며, 기능이 추가되거나 변경 시 시스템 전반적으로 수정해야한다.

  3. Benefit [디자인 장점]

    1. 서브시스템을 추상화 하므로, 호출 시스템에서는 모든 서브시스템을 알 필요가 없다.

    2. 따라서 프로그램 변경 시 수정할 부분이 적다.

  4. Structure & Sample Code [구조와 샘플코드]

    1) 빌링과 송장을 만드는 시스템

    1. UML

      서브시스템을 파사드가 추상화 시켜준다. 즉, 서브시스템이 변경되어도 클라이언트(호출객체)는 파사드만 바라보면 하위 시스템을 쉽게 호출할 수 있다.

    2. 구조

      -> 빌링 객체가 생성되면 송장 객체를 만든다.
      -> 빌링객체와 송장 객체는 별도의 시스템에 존재하며, 클라이언트 시스템에서 두 시스템을 호출한다
      -> 클라이언트 시스템은 빌링과 송장생성을 위해 빌링 시스템과 송장시스템의 메소드를 호출하여야 한다.

    3. 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);

    }   
}

results matching ""

    No results matching ""