본문 바로가기
CS

팩토리 패턴

by Shark_상어 2023. 1. 20.
728x90

팩토리 패턴

팩토리 패턴(factory pattern)은 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서

상위 클래스가 중요한 뼈대를 결정, 하위클래스에서 객체 생성에 관한 구체적인 내용을 결정 하는 패턴을 말한다.

상위 클래스 와 하위 클래스는 분리 되기 때문에 **느슨한 결합**을 가지며 상위클래스에서는 인스턴스 생성 방식에 대해

전혀 알 필요가 없어, 더 많은 유연성을 가진다.

또한, 객체 생성 로직이 따로 떼어져 있기 때문에 코드를 리팩토링 하더라도 한 곳만 고 칠수 있게 되니 유지 보수성이 증가한다.

ex) 라떼 레시피, 아메리카노 레시피, 우유 레시피 라는 구체적인 내용이 들어 있는 하위 클래스가 컨베이어 벨트를 통해 전달되고,

상위 클래스인 바리스타 공장에서 이 레시피들을 토대로 우유 등을 생산하는 생산 공정을 생각하면 된다.

자바의 팩토리 패턴

abstract class Coffee {
    public abstract int getPrice();
    
    @Override
    public String toString() {
        return "Hello this coffee is" + this.getPrice();
    }
}

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 DefaultCoffee();
    }
}

class DefaultCoffee extends Coffee {
    private int price;
    
    public DefaultCoffee() {
        this.price = -1;
    }
    
    @Override
    public int getPrice() {
        return this.price;
    }
}

class Lattee extends Coffee {
    private int price;
    
    public Latte(int price) {
        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 HelloWorld {
    public static void main(String[] args) {
        Coffee latte = CoffeeFatory.getCoffee("Latte", 4000);
        Coffee ame = CoffeeFatory.getCoffee("Americano", 3000);
        
        System.out.println("Factory latte ::" + latte);
        System.out.println("Factory ame ::" + ame);
        
    }
}

/*
Factory latte :: Hello this coffee is 4000
Factory ame :: Hello this coffee is 3000
*/

if ("Latte".equalsIgnoreCase(type))을 통해 문자열 비교 기반으로 로직이 구성 됨을 볼 수 있다. 이는 Enum 또는 Map을 이용하여

if 문을 쓰지 않고 매핑해서 할 수도 있다.

 

참조: 면접을 위한 전공 CS지식 노트

728x90

'CS' 카테고리의 다른 글

옵저버 패턴  (0) 2023.01.23
전략 패턴  (0) 2023.01.21
디자인 패턴 - 싱글톤 패턴  (0) 2023.01.18
CPU 스케줄링 알고리즘  (0) 2023.01.16
공유자원 과 임계영역 & 교착상태  (0) 2023.01.15