스파이더웹 2022. 7. 20. 14:08
728x90
반응형

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

상위 하위 클래스로 분리되기 때문에 느슨한 결합을 가지며, 상위클래스에서는 객체 생성과 관련이 없기 때문에 유연성을 가진다

생성로직이 분리되어 있어 리팩토링시에 한 곳만 고칠 수 있게 되니 유지 보수성이 증가한다

package book.designpattern;

abstract class Coffee{
    public abstract int getPrice();

    @Override
    public String toString() {
        return "이 커피는 " + this.getPrice() + "원 입니다";
    }
}

//if문을 통해 문자열 비교기반으로 로직을 구성
class CoffeeFactory {
    public static Coffee getCoffee(String type, int price){
        if ("Latte".equalsIgnoreCase(type)) return new Latte(price);
        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 Factory {
    public static void main(String[] args) {
        Coffee latte = CoffeeFactory.getCoffee("Latte", 4000);
        Coffee ame = CoffeeFactory.getCoffee("Americano", 3000);
        System.out.println("Latte : " + latte);
        System.out.println("Ame : " +  ame);
    }
}

결과
Latte : 이 커피는 4000원 입니다
Ame : 이 커피는 3000원 입니다
public enum CoffeeType {

    Latte,
    Americano,
    DefaultCoffee;
}

abstract class Coffee{
    public abstract int getPrice();

    @Override
    public String toString() {
        return "이 커피는 " + this.getPrice() + "원 입니다";
    }
}

//기존 if문에서 enum을 이용하여 매핑
class CoffeeFactory {
    public static Coffee getCoffee(CoffeeType type, int price) {

        switch (type){
            case Latte:
                return new Latte(price);
            case Americano:
                return new Americano(price);
            default:
                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 Factory {
    public static void main(String[] args) {
        Coffee latte = CoffeeFactory.getCoffee(CoffeeType.Latte, 4000);
        Coffee ame = CoffeeFactory.getCoffee(CoffeeType.Americano, 3000);
        System.out.println("Latte : " + latte);
        System.out.println("Ame : " +  ame);
    }
}
728x90
반응형