[자바 디자인 패턴] 생성패턴 - 팩토리 메소드 패턴

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

생성패턴 목록

 

시스템을 설계할 때에는 먼저 추상적으로 설계를 하게 될 수 밖에 없다. 

때문에 추상적인 개념을 추상클래스로 만들어 두고 팩토리 메소드 패턴을 적용하면

기초 설계에 있어서 유용할 것 같다고 생각한다.

 

장점

- 서브클래스가 객체타입을 선택해서 생성할 수 있습니다.

- 특정 클래스를 코드에 바인딩 할 필요가 없어서 느슨한 결합을 촉진합니다.

- 코드는 인터페이스와 추상클래스만 상호작용하기 때문에 인터페이스를 구현하거나 추상클래스를 상속받은 모든 클래스에서 작동합니다.

 

사용시기

- 클래스가 어떤 서브클래스를 생성해야 하는지 모르는 경우

- 클래스가 서브클래스에서 생성할 객체를 지정하려고 하는 경우

- 부모클래스가 하위클래스에 대한 객체생성을 선택하는 경우

 

UML

- units : 전기 사용량

- rate : 사용량 * rate = 전기요금

- 같은 양을 사용했을 경우에 용도에 따라 요금을 세가지로 분류하는 UML 이다

  Domestic : 가정용 기준 요금

  Commercial : 산업용 기준 요금

  Institutional : 기관용 기준 요금

Abstract Model Class : Plan

public abstract class Plan {
    protected double rate;
    
    public abstract void getRate();
    public void calulateBill(int units){
        System.out.println(units*rate);
    }
}

 

Extends Model Class : DomesticPlan / CommercialPlan / InstitutionalPlan

public class DomesticPlan extends Plan{
    @Override
    public void getRate(){
        rate=3.50;
    }
}
public class CommercialPlan extends Plan{
    @Override
    public void getRate(){
        rate=6.50;
    }
}
public class InstitutionalPlan extends Plan{
    @Override
    public void getRate(){
        rate=1.50;
    }
}

 

Factory Class : GetPlanFactory

public class GetPlanFactory{
    public Plan getPlan(String planType){
        if(planType == null){
            return null;
        }
        
        if(planType.equalsIgnoreCase("DOMESTICPLAN")){
            return new DomesticPlan();
        }
        else if(planType.equalsIgnoreCase("COMMERCIALPLAN")){
            return new CommercialPlan();
        }
        else if(planType.equalsIgnoreCase("INSTITUTIONALPLAN")){
            return new InstitutionalPlan();
        }
        
        return null;
    }
}

 

Operation Class : GenerateBill

public class GenerateBill{
    public static void main(String[] args) throws IOException{
        GetPlanFactory planFactory = new GetPlanFactory();
        Plan plan = null;
        int units = 500;
        
        System.out.print("1. DomesticPlan");
        plan = planFactory.getPlan("DOMESTICPLAN");
        plan.getRate();
        plan.calculateBill(units);
        
        System.out.print("2. CommercialPlan");
        plan = planFactory.getPlan("COMMERCIALPLAN");
        plan.getRate();
        plan.calculateBill(units);
        
        System.out.print("3. InstitutionalPlan");
        plan = planFactory.getPlan("INSTITUTIONALPLAN");
        plan.getRate();
        plan.calculateBill(units);
    }
}

 

 

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

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