POOPOO: 배변 일기 앱
SMALL
생성패턴 목록
- 팩토리 메소드 패턴 (Factory Method Pattern)
- 추상 팩토리 패턴 (Abstract Factory Pattern)
- 싱글톤 패턴 (Singleton Pattern)
- 프로토타입 패턴 (Prototype Pattern)
- 빌더 패턴 (Builder Pattern)
- 오브젝트 풀 패턴 (Object Pool Pattern)
시스템을 설계할 때에는 먼저 추상적으로 설계를 하게 될 수 밖에 없다.
때문에 추상적인 개념을 추상클래스로 만들어 두고 팩토리 메소드 패턴을 적용하면
기초 설계에 있어서 유용할 것 같다고 생각한다.
장점
- 서브클래스가 객체타입을 선택해서 생성할 수 있습니다.
- 특정 클래스를 코드에 바인딩 할 필요가 없어서 느슨한 결합을 촉진합니다.
- 코드는 인터페이스와 추상클래스만 상호작용하기 때문에 인터페이스를 구현하거나 추상클래스를 상속받은 모든 클래스에서 작동합니다.
사용시기
- 클래스가 어떤 서브클래스를 생성해야 하는지 모르는 경우
- 클래스가 서브클래스에서 생성할 객체를 지정하려고 하는 경우
- 부모클래스가 하위클래스에 대한 객체생성을 선택하는 경우
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);
}
}
LIST