디자인 패턴 - 팩토리 패턴

namkun·2022년 9월 15일
0

디자인 패턴

목록 보기
2/3

팩토리 패턴

팩토리 패턴은 객체를 사용하는 코드에서 객체 생성 부분을 떼서 따로 추상화 한 패턴이다.

더 쉽게 이야기하자면, 인터페이스는 미리 정의해두고, 인스턴스를 만들 클래스의 결정은 인터페이스를 상속한 서브 클래스 쪽에서 결정을 내리는 패턴이라고 생각하면 된다.

해당 패턴의 장점이라고 하면, 상위 클래스와 서브 클래스가 분리되기에 디커플링 되며 상위 클래스에서는 인스턴스의 생성 방식에 대해서 전혀 알 필요가 없어서 유연성을 갖게 된다.

또한, 객체 생성 로직이 따로 분리되어 있기에 코드를 쉽게 손볼 수 있다는 장점이 생긴다.

관련해서 아래의 코드를 통해 이해 해보자.

Coffee.java

public abstract class Coffee {
    public abstract int getPrice();
    public abstract String getType();

    @Override
    public String toString(){
        return "주문하신 "+ this.getType() +"는 " + this.getPrice() + "원 입니다.";
    }
}

Americano, Latte, MixCoffee.java

public class Americano extends Coffee {
    private final int price;
    private final String type;

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

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

    @Override
    public String getType() {
        return type;
    }
}


public class Latte extends Coffee {
    private final int price;
    private final String type;

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

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

    @Override
    public String getType() {
        return type;
    }
}

public class MixCoffee extends Coffee {
    private final int price;
    private final String type;

    public  MixCoffee() {
        this.price = 3000;
        this.type = "Mix Coffee";
    }

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

    @Override
    public String getType() {
        return type;
    }
}

CoffeeFactory.java

public class CoffeeFactory {
    public static Coffee getCoffee(String type, int price){
        if("Latte".equalsIgnoreCase(type)){
            return new Latte(type, price);
        } else if ("Americano".equalsIgnoreCase(type)) {
            return new Americano(type, price);
        } else {
            return new MixCoffee();
        }
    }
}

Cafe.java

public class Cafe {
    public static void main(String[] args) {
        Coffee Latte = CoffeeFactory.getCoffee("Latte", 5000);
        Coffee Americano = CoffeeFactory.getCoffee("Americano", 4500);
        System.out.println(Americano);
        System.out.println(Latte);
    }
}

위의 코드를 보면, CoffeeFactory 클래스의 getCoffee 메서드가 static으로 구현되어있다는 것을 확인할 수 있고, 이 메서드를 통해서 type의 값이 Latte인 경우 Latte 인스턴스를 반환, Americano인 경우 Americano 인스턴스를 반환하는 것을 확인할 수 있다.

이렇게 팩토리 메서드 패턴을 사용하게 되면 인스턴스를 필요로 하는 클래스에서 Coffee 클래스의 서브 클래스에 대한 정보를 몰라도 인스턴스를 생성할 수 있게 된다.

커피의 종류가 좀 더 다양해진다고 해도 getCoffee 메서드를 통해서 인스턴스를 제공 받던 쪽에서는 코드를 수정할 필요가 없게 된다.

profile
개발하는 중국학과 사람

0개의 댓글