본문 바로가기

지식/Computer Science

[디자인 패턴] 팩토리 패턴 (Factory Pattern)

팩토리 패턴은 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴입니다.

 

상위 클래스와 하위 클래스가 분리되어 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 모르기에 더 많은 유연성을 갖게 됩니다.

그리고 로직이 분리되어 리팩토링하더라도 한 곳만 고칠 수 있게 되어 유지 보수성이 증가됩니다.

 

예를 들어, 라떼 레시피, 아메리카노 레시피, 우유 레시피 등 구체적인 내용이 들어 있는 하위 클래스가 상위 클래스로 전달 되면

상위 클래스인 바리스타 공장에서는 이 레시피를 토대로 라떼, 아메리카노, 우유를 생산한다고 생각하면 됩니다.

 

abstract class Coffee{
    public abstract int getPrice();

    //toString은 Object 가지는 메소드이기 때문에 오버라이딩 할 수 있음
    //오버라이딩을 함으로써 주소가 아니라 문자+가격이 출력
    @Override
    public String toString(){
        return "Hi this coffee is "+ this.getPrice();
    }
}

class CoffeeFactory{
    public static Coffee getCoffee(String type, int price){ // 입력에 따른 생성을 이 CoffeeFactory에서 담당
        if("Latte".equalsIgnoreCase(type)) return new Latte(price); //Enum, Map을 이용하여 if문을 쓰지 않고 매핑 가능
        else if ("Americano".equalsIgnoreCase(type)) return new Americano(price);
        else return new DefaultCoffee();
    }
}

class DefaultCoffee extends Coffee {
    private int price;

    public DefaultCoffee(){
        this.price = -1;
    }

    @Override
    public int getPrice() {
        return this.price;
    }
}

class Latte extends Coffee{
    private int price;

    public Latte(int price){
        this.price = price;
    }

    @Override
    public int getPrice() {
        return this.price;
    }
}

class Americano extends Coffee {
    private int price;

    public Americano(int price){
        this.price = price;
    }

    @Override
    public int getPrice() {
        return this.price;
    }
}


public class main {
    public static void main(String[] args) {
        Coffee latte = CoffeeFactory.getCoffee("Latte", 4000);
        Coffee ame = CoffeeFactory.getCoffee("Americano", 3000);

        System.out.println("latte = " + latte); //latte = Hi this coffee is 4000
        System.out.println("americano = " + ame); //americano = Hi this coffee is 3000
    }
}

참고

[책] 면접을 위한 CS 전공지식 노트