ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] Factory Pattern 팩토리 패턴
    Study/Design Pattern 2021. 7. 17. 21:24

    인터페이스를 상속받는 구현 클래스들의 객체를 생성할 때, 생성자를 통해 직접 생성하는 것이 아닌 해당 인터페이스를 상속하는 하위 클래스에서 객체를 생성하는 것을 팩토리 패턴이라고 한다. 즉 객체 생성을 다른 서브 클래스로 캡슐화하여 구현 클래스에 대한 의존성을 줄이는 것이다. 이를 통해 얻을수 있는 효과는 클래스간의 결합도를 낮춰, 변경과 제거를 최소화 할 수 있다.

     

     

    만약 음식이라는 클래스를 상속받는 여러 음료수 하위 클래스가 존재하는 상황을 가정해 보겠다.

    // Food 추상 클래스
    public abstract class Food{
        public abstract String eat();
    }
    
    
    ///////////////////////////////
    
    public class Pizza extends Food{
        @Override
        public String eat(){
            return "yammy~ pizza";
        }
    }
    
    public class Chicken extends Food{
    
        @Override
        public String eat(){
            return "yammy~ chicken";
        }
    }

     

    이때 각 객체를 생성할 때  new 연산자를 하위클래스에 직접사용하지 않고 간단한 팩토리 패턴을 이용해서 생성해보자

     

    public abstract class FoodFactory{
        public abstract Food create(String type);
    }
    public class MealFactory extends FoodFactory{
    
        @Override
        public create(String type){
            Food food = null;
    
            switch(type){
                case("pizza"):
                    food = new Pizza();
                    break;
                case("chicken"):
                    food = new Chicken();
                    break;
                default:
                    food = null;
            }
            return food;
        }
    }

     

    위와 같이 FoodFactory 추상 클래스를 만든 다음에 하위 클래스에서 상속하여 create 매소드를 통해 객체를 반환하는 것을 확인할 수 있다. 만약 food 상속 클래스 중에 음료스는 meal과 먹는 방법이 달라 다른 방법으로 생성을 해야 한다면 마찬가지고 FoodFactory를 상속하는 BeverageFactory 클래스를 생성하여 사용할 수 있다.

     

    직접 팩토리를 이용하여 객체를 생성해보면 아래와 같다. 이렇게 mealFactory 객체 안에서 어떻게 객체가 생성되는지 모르는 것처럼 캡슐화하였고, 만약 Food 클래스에 변경이 일어나도 클래스 객체를 사용하는 모든 코드를 수정할 필요 없이 반환받은 객체만 이용하면 된다는 장점이 있다.

    MealFactory mealFactory = new MealFactory();
    Food pizza = mealFactory.create("pizza");
    Food chicken = mealFactory.create("chicken");
    
    System.out.println(pizza.eat());
    System.out.println(chicken.eat());
    
    
    // output
    // yammy~ pizza
    // yammy~ chicken
     

    댓글

Designed by Tistory.