블로그명..?

Factory Method 본문

Design Patterns

Factory Method

bs_choi 2020. 4. 15. 23:53

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private ISomeObj obj;
 
 
    public void createObj(int type){
        switch (type){
            case 1:
                obj = new Obj1();
            case 2:
                obj = new Obj2();
            default:
                throw new IllegalStateException("Unexpected value: " + type);
        }
    }
 
cs

구상클래스에서 객체의 인스턴스를 생성할 때 위와 같은 코드를 사용할 경우. 

새로운 구상클래스가 추가될 때 마다 코드를 수정해야한다. OCP 원칙에 위배.

 

간단한 팩토리(SImple Factory)

 

 

클라이언트가 아닌 SimpleFactory 클래스를 새로만들어 여기에 구상 클래스의 생성을 위임한다.

 

 

팩토리 메서드(Factory Method)

 

프레임워크

 

1. 기존 클라이언트 부분이었던 PizzaStore를 추상클래스로 변경하고 실제 객체를 생성하는 createPizza()를 추상 메소드로 선언한다.

1-1. 하위 서브클래스에서 공통부분인 orderPizza()를 오버라이드해서 사용하도록 만든다. (수정 불가능하게 final로 선언해도 무방)

 

 

2. PizzaStore의 서브클래스에서 실제 구상클래스의 인스턴스를 생성하는 createPizza를 구현한다.

2-1. PizzaStore는 추상 클래스이기 때문에 실제 PizzaStore의 서브클래스가 만들어지고 createPizza를 구현하기 전까지는 실제 구상클래스의 인스턴스는 생성이 되지 않는다. (PizzaStore와 Pizza 객체는 완전히 분리되어 있음)

 

 

팩토리 메서드는 객체 생성 처리에 관한 디자인 패턴임.

이를 이용하여, 객체를 생성하는 작업을 서브클래스에 캡슐화 시키고, 슈퍼클래스에 있는 클라이언트 코드와, 서브클래스의 객체 생성 코드를 분리시킬 수 있음.

 

 

객체 클래스

1. 추상클래스로 객체클래스를 선언. 각 객체가 공통적으로 하는 행위들을 구상메소드로 선언한다.

 

2. 객체 클래스의 서브클래스를 생성한다. 구현하고자 하는 상황에 따라 바뀌는 부분은 Override 하거나, 파라메터의 값을 각각 설정해준다.

 

클라이언트(사용)

1.  원하는 PizzaStore를 생성하여 orderPizza를 실행한다.

클라이언트에서는 각 PizzaStore에서의 order 피자가 어떻게 동작하는지 알 수 없고, 결과만 받게 된다. 

2. 클라이언트에서 선택한 서브클래스에 따라 생성되는 객체 인스턴스가 달라진다.

-> 수퍼클래스의 인스턴스 생성하는 일을 서브클래스에 위임한다.(서브클래스가 인스턴스의 종류를 결정하는 것이 아님)

Comments