- '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 |
---|