능히 해낼 수 있다

230317 CS지식습득을 위한 메모: 팩토리 패턴 편 본문

개발🌐/CS지식

230317 CS지식습득을 위한 메모: 팩토리 패턴 편

roni_eo 2023. 3. 17. 10:18
반응형

✍️✍️✍️ 위 글은 면접을 위한 CS 전공지식 노트를 읽고 학습한 내용으로 구성되었으며,
작성자의 지식습득에 따라 추후 퇴고 될 수 있음을 알려드립니다(피드백 환영).


공장의 컨베이어 벨트처럼, 들어가는 각 제품 공정을 통해 비슷 한 듯 새 제품을 추출해 낼 수 있는 구조를 빗대어 공장패턴(factory pattern)이라고 한다. 좀 더 CS적인 설명을 추가하자면, 팩토리 패턴은 객체를 사용하는 코드에서 객체 생성부분을 떼어 추상화한 패턴이자 상속관계에 있는 두 클래스에서 부모클래스가 중요한 뼈대를 결정하고, 자식클래스에서 객체 생성에 관란 구체적인 내용을 결정하는 패턴이다.

클래스가 상하위로 분리되기 때문에 객체 생성을 별도의 팩토리에 위임하여 클래스 간의 강한 의존성을 줄이고, 클라이언트 코드의 유연성을 높이는 디자인 패턴인것이다. 이로 인해 변경이나 추가가 필요한 경우, 해당 팩토리만 수정하여 코드의 수정 범위를 최소화할 수 있다.

장점 단점
코드 재사용: 객체 생성 로직을 중앙에서 관리하므로 중복 코드를 방지하고 재사용성을 높일 수 있음 추가적인 추상화: 팩토리 패턴을 도입하면 코드에 추가적인 추상화 계층이 생기기 때문에 코드의 복잡성이 늘어날 수 있음.
객체 생성 관리: 객체 생성 로직의 변경이 필요한 경우, 팩토리만 수정하면 되므로 객체 생성 관리 편리. 복잡성 증가: 단순한 객체 생성의 경우에는 팩토리 패턴이 불필요할 수 있으며, 불필요한 복잡성을 초래할 수 있음.

아래는 Pizza를 예시로 구현해 본 팩토리 패턴이다. 읽고있는 책의 예시는 커피로 나와있지만, enum도 활용해 보고싶고 예시도 바꿔 보면서 코드를 살피면 좋을 것 같아 아래와 같이 구현해 보았다.

(물론 JAVA는 잘 못하기 때문에 chatGPT의 교정 도움을 받았다.)


enum을 사용 해 피자타입을 매핑했다.
enum이란, 
상수의 집합을 정의할 때 사용되는 타입이다. 상수나 메서드 등을 집어넣어서 관리하며 코드를 리팩토링할 때 해당 집합에 관한 로직 수정 시 이 부분만 수정하면 되므로 코드 리팩토링 시 강점이 생긴다.

enum PizzaType {
    CHICAGO(0, 4000),
    NY(1, 3000),
    DEFAULT(-1, -1);

    private int priceIndex;
    private int[] prices;

    PizzaType(int priceIndex, int... prices) {
        this.priceIndex = priceIndex;
        this.prices = prices;
    }

    public int getPrice() {
        return prices[priceIndex];
    }
}

abstract class Pizza {
    public abstract PizzaType getPizzaType();

    public int getPrice() {
        return getPizzaType().getPrice();
    }

    @Override
    public String toString() {
        return "Hi this " + getPizzaType().name() + " Pizza is " + this.getPrice();
    }
}

class PizzaFactory {
    public static Pizza getPizza(PizzaType type) {
        switch (type) {
            case CHICAGO:
                return new ChicagoPizza();
            case NY:
                return new NYPizza();
            default:
                return new DefaultPizza();
        }
    }
}

class DefaultPizza extends Pizza {
    @Override
    public PizzaType getPizzaType() {
        return PizzaType.DEFAULT;
    }
}

class ChicagoPizza extends Pizza {
    @Override
    public PizzaType getPizzaType() {
        return PizzaType.CHICAGO;
    }
}

class NYPizza extends Pizza {
    @Override
    public PizzaType getPizzaType() {
        return PizzaType.NY;
    }
}

public class HelloRestaurant {
    public static void main(String[] args) {
        Pizza ChicagoPizza = PizzaFactory.getPizza(PizzaType.CHICAGO);
        System.out.println("Factory Chicago Pizza ::" + ChicagoPizza);
    }
}
/*Factory Chicago Pizza ::Hi this CHICAGO Pizza is 4000*/

enum을 사용 해 피자타입을 매핑했다. enum이란, 상수의 집합을 정의할 때 사용되는 타입이다. 상수나 메서드 등을 집어넣어서 관리하며 코드를 리팩터링할 때 해당 집합에 관한 로직 수정 시 이 부분만 수정하면 되므로 코드 리팩터링 시 강점이 생긴다.

대문사진 출처: https://www.pngegg.com/ko/png-edujc

반응형