[자바 디자인 패턴] 생성패턴 - 추상 팩토리 패턴

2021. 3. 16. 01:48 JAVA/Design Patterns

생성패턴 목록

 

앞에서 배운 팩토리 메소드 패턴을 여러개를 동시에 사용해야 하는 경우에는 추상 팩토리 패턴을 사용하면 새로운 팩토리(추가기능)가 생기더라도 기존에 구현해 놓은 코드에 영향을 주지 않을 수 있고, 새로운 팩토리를 사용하는 클래스에서도 기존 방식과 동일하게 팩토리를 생성하여 사용할 수 있다.

 

장점

- 클라이언트 코드를 구현클래스에서 분리합니다.

- 객체 패밀리의 교환을 용이하게 합니다.

- 객체의 일관성을 향상시킵니다.

 

사용시기

- 시스템이 객체의 생성, 구성 및 표현방법과 독립적이어야 하는 경우

관련 객체 패밀리를 함께 사용해야하는 경우(필수)

구현을 표시하지 않고 인터페이스 만 표시하는 오브젝트 라이브러리를 제공하려는 경우

- 시스템을 여러객체의 패밀리 중 하나로 구성해야하는 경우

 

UML

은행, 대출종류, 할부개월을 입력하여 매달 갚을 금액을 알아보기 위한 UML 입니다.

- Bank : 은행

- Loan : 대출

- InterestRate : 이자율

EMI : 지불해야할 대출금액

- years : 할부기간 (년)

 

Abstract Model Class : AbstractFactory, Bank, Loan

public abstract class AbstractFactory{  
    public abstract Bank getBank(String bank);
    public abstract Loan getLoan(String loan);
}
public interface Bank{
    String getBankName();
}
public abstract class Loan{
    protected double rate;
    
    abstract void getInterestRate(double rate);
    public void calculateLoanPayment(double loanamount, int years){
        double EMI;
        int n;
        
        n=years*12;
        rate=rate/1200;
        
        EMI=((rate*Math.pow((1+rate),n))/((Math.pow((1+rate),n))-1))*loanamount;
        
        System.out.println("your monthly EMI is "+ EMI +" for the amount"+loanamount+" you have borrowed");
    }  
}  

 

Extends Model Class1) AbstractFactory : BankFactory, LoanFactory

public class BankFactory extends AbstractFactory{
    public Bank getBank(String bank){
        if(bank == null){
            return null;
        }
        
        if(bank.equalsIgnoreCase("KOOKMIN")){
            return new KOOKMIN();
        }
        else if(bank.equalsIgnoreCase("WOORI")){  
            return new WOORI();
        }
        else if(bank.equalsIgnoreCase("SHINHAN")){  
            return new SHINHAN();
        }
        else if(bank.equalsIgnoreCase("HANA")){  
            return new HANA();
        }
        
        return null;
    }  
   
    public Loan getLoan(String loan) {  
        return null;  
    }
}
public class LoanFactory extends AbstractFactory{
    public Bank getBank(String bank){
        return null;
    }  
   
    public Loan getLoan(String loan) {
        if(loan == null){
            return null;
        }
        
        if(loan.equalsIgnoreCase("Home")){
            return new HomeLoan();
        }
        else if(loan.equalsIgnoreCase("Business")){
            return new BussinessLoan();
        }
        else if(loan.equalsIgnoreCase("Education")){
            return new EducationLoan();
        }
        
        return null;  
    }
}

 

2) Bank : KOOKMIN, WOORI, SHINHAN, HANA

public class KOOKMIN implements Bank{
    private final String BNAME;
    
    public KOOMIN(){
        BNAME="KOOKMIN BANK"
    }
    
    public String getBankName(){
        return BNAME;
    }
}
public class WOORI implements Bank{
    private final String BNAME;
    
    public WOORI(){
        BNAME="WOORI BANK"
    }
    
    public String getBankName(){
        return BNAME;
    }
}
public class SHINHAN implements Bank{
    private final String BNAME;
    
    public SHINHAN(){
        BNAME="SHINHAN BANK"
    }
    
    public String getBankName(){
        return BNAME;
    }
}
public class HANA implements Bank{
    private final String BNAME;
    
    public HANA(){
        BNAME="HANA BANK"
    }
    
    public String getBankName(){
        return BNAME;
    }
}

 

3) Loan : HomeLoan, BusinessLoan, EducationLoan

public class HomeLoan extends Loan{
    public void getInterestRate(double r){
        rate=r;
    }
}
public class BusinessLoan extends Loan{
    public void getInterestRate(double r){
        rate=r;
    }
}
public class EducationLoan extends Loan{
    public void getInterestRate(double r){
        rate=r;
    }
}

 

Operation Class : FactoryCreator, AbstractFactoryPatternExample

public class FactoryCreator{
    public static AbstractFactory getFactory(String choice){
        if(choice.equalsIgnoreCase("Bank")){
            return new BankFactory();
        }
        else if(choice.equalsIgnoreCase("Loan")){
            return new LoanFactory();
        }
        
        return null;
    }
}
public class AbstractFactoryPatternExample {
    public static void main(String[] args){
        AbstractFactory bankFactory = FactoryCreator.getFactory("Bank");
        Bank bank = bankFactory.getBank("KOOKMIN");
        
        
        AbstractFactory loanFactory = FactoryCreator.getFactory("Loan");
        Loan loan = loanFactory.getLoan("Home");
        loan.getInterestRate("5");
        
        double loanAmount = 5000000;
        int years = 20;
        loan.calculateLoanPayment(loanAmount,years);
    }
}

 

출처 : https://www.javatpoint.com/

know-one-by-one.tistory.com/34