📌 디자인패턴

팩토리 패턴 (Factory Pattern)

j_estory 2022. 8. 26. 21:49

- 'new' 연산자가 눈에 띈다면 '구상'이라는 용어를 떠올려주세요.

- 변화하는 무언가 때문에 new를 조심해서 사용해야 합니다.

- 인터페이스를 바탕으로 만들어진 코드는 어떤 클래스든 특정 인터페이스만 구현하면 사용할 수 있다. 이것은 '다형성' 덕분이다.

- 구상클래스를 바탕으로 만들어진 코드는 구상 클래스가 추가될때마다 코드를 고쳐야 하므라 '변경에 닫혀 있는' 코드가 된다.

- 바뀌는 부분을 찾아내서 바꾸지 않는 부분과 분리해야 한다.

Pizza orderPizza(String type) {
	Pizza pizza;
	if (type.equals("chesse")) { // 변경되는 부분
    	...
    } 
	
    pizza.prepare(); // 변경되지 않는 부분
    ...
}

- 변경 되는 부분은 피자를 만드는 일만 처리하는 객체를 생성하여 해당 객체에 넣습니다. -> 팩토리 클래스

public class SimplePizzaFactory {
	public Pizza createPizza(String type) {
    	...
        return pizza;
    }
}

- 해당 클래스를 통하여 수정 되는 부분

public class PizzaStore {
	SimplePizzaFactory factory;
    
    public PizzaStore(SimplePizzaFactory factory) {
    	this.factory = factory;
    }
    
    public Pizza orderPizza(String type) {
    	Pizza pizza;
    	pizza = factory.createPizza(†ype);
        
        ...
    }
}

 

- 각 지점에서 피자를 만들긴 하는데 굽는 방식 등 달라지는 일 발생 -> pizzaStore와 피자 제작 코드 전체를 하나로 묶어줘야 한다.

public abstract class pizzaStore {
	
    public Pizza orderPizza(String type) {
    	Pizza pizza;
        pizza = createPizza(type);
        
        pizza.prepare();
        ...
    }
    
    abstract Pizza createPizza(String type); // 추상 메소드로 선언 하여 서브클래스들이 구현하도록!
}

- orderPizza () 메소드는 pizzaStore에서 정의한 내용을 그대로 사용하게 된다. 

- 내용을 고쳐쓰지 않게 하려면 final로 정의

public class NYPizzaStore extends PizzaStore {
	Pizza createPizza(String item) {} // 추상 메소드로 선언되었으므로 구상 클래스에서 반드시 구현
    // PizzaStore을 확장했기때문에 orderPizza() 메소드도 자동으로 상속받게 된다.
}

- 슈퍼 클래스에 있는 orderPizza()는 어떤 피자가 만들어지는지 전혀 알 수 없습니다.

- 요 위에 있는 코드를 실제로 적용해보면

PizzaStore nvPizzaStore = new NYPizzaStore();
nvPizaaStore.orderPizza("cheese");
Pizza pizza = createPizza("cheese");
// 피자 작업 마무리
pizza.prepare(); 
...

팩토리 메소드 패턴 살펴보기

- 모든 팩토리 패턴은 객체 생성을 캡슐화 한다. 

- 팩토리 메소드 패턴은 서브클래스에서 어떤 클래스를 만들지 결정함으로써 객체 생성을 캡슐화 한다. 

 

팩토리 메소드 정의 

- 객체 생성 시, 필요한 인터페이스를 만든다.

- 어떤 클래스의 인터페이스를 만들지는 서브클래스에서 결정

- 팩토리 메소드 패턴을 사용하면 클래스 인스턴스를 만드는 일은 서브클래스에게 맡기게 된다.

 

- 팩토리 메소드 패턴에서는 어떤 클래스의 인스턴스를 만들지를 서브클래스에서 결정한다.

- 여기서 결정 한다 라는 것은 서브 클래스에서 어떤 클래스의 인스턴스를 만들지 결정해서가 아니라 생산자 클래스가 실제 생산될 제품을 전혀 모르는 상태로 만들어지기 때문이다.

'📌 디자인패턴' 카테고리의 다른 글

싱글턴 패턴 (SingleTon Pattern)  (0) 2022.10.12