지난 글 작성이 10.20 인걸 보니 정말 오랜기간 비웠구나 싶다. 공부를 하지않은 것은 아니다. 시험기간이 껴있었으니 공부는 당연했다. 사실 4학년 2학기다 보니깐 학과공부가 눈에 들어오지 않는다. 전공이 1개고 나머지가 교양인 이유도 있을터이다.
부재 기간동안에도 boj 는 풀었다. 하지만, 이게 푼 모든 문제를 여기다가 작성을 해야하는지 뭔가 스스로 판단하기가 되게 애매한 것 같다. 쉽게 풀리는 것 또한 올려야 하나 그런 생각이 든다. 애초에 누굴 보여주려는 목적이 아닌 나의 공부를 위한 tistory 인 것인데, 내가 몰라서 헤맨 부분만 올려야 맞지 않나 라는 생각이 든다. 요즘 드는 생각이 많다. 미래에 대한 생각이 대부분이다. 그래서 그 생각을 하지않으려고 회피하려고 하는 내 모습을 자주보게 된다. 스스로 자책하고 채찍질하지만, 그 아픔을 잊으려 채찍질 했다는 사실조차도 잊으려고 한다. 이 부분은 정말 딜레마다. 말이 너무 길었던 것 같다. 팩토리 패턴부터 시작하자.
구상 클래스를 바탕으로 코딩을 하면 나중에 코드를 수정해야 할 가능성이 높아지고, 유연성이 떨어지게 된다.
'new' 는 '구상 객체'를 뜻한다. 일련의 구상 클래스들이 있을 때는 어쩔 수 없이 다음과 같은 코드를 만들어야 하는 경우가 있다.
Duck duck;
if(picnic){
duck=new MallardDuck();
}else if(hunting){
duck=new DecoyDuck();
}
이런 코드는 무언가를 변경하거나 확장해야 할 때 코드를 다시 확인하고 추가 또는 제거해야 한다는 것을 뜻한다. 따라서 코드를 이런식으로 만들면 관리 및 갱신하기가 어려워지고, 오류가 생길 가능성도 높아지게 된다.
Pizza orderPizza(String type){
Pizza pizza;
if(type.equals("cheese")){
pizza=new CheesePizza();
}else if(type.equals("greek")){
pizza=new GreekPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
이런식으로 되어있다면 정말 번거로울 것이다. 따라서 저 바뀌는 부분을 따로 캡슐화를 해야한다.
이렇게 따로 빼어내서
public class SimplePizzaFactory{
public Pizza createPizza(String type){
Pizza pizza=null;
if(type=="cheese"){
pizza=new CheesePizza();
}else if(type.equals("pepperoni")){
pizza=new PepperoniPizza();
}
return pizza;
}}
이런식으로 따로 클래스로 정의했다.
여기서 아까의 그 문제를 그냥 다른 객체로 넘겨버렸다고 생각할 수도 있지만, 이 클래스를 사용하는 클래스가 많다고 생각을 한다면 이 클래스 1개를 고침으로써 모두 해결이 되게되므로 유용하다.
이것을 적용해서 코드를 살펴보자.
public class PizzaStore {
SimplePizzaFactory factory;
public PizzaStore(SimplePizzaFactory factory) {
this.factory=factory;
}
public Pizza orderPizza(String type) {
Pizza pizza;
pizza=factory.createPizza(type);
pizza.preprare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
만약 지역별 피자 가게마다 피자의 스타일이 다르다면
NYPizzaFactory nyFactory=new NYPizzaFactory();
PizzaStore nyStore=new PizzaStore(nyFactory);
nystore.order("Veggie");
이런식으로 할 것이다. 아니면 피자를 만드는 활동 자체는 전부 PizzaStore 클래스에 국한시키면서도 분점마다 고유의 스타일을 살릴 수 있도록 하는 방법이 있다. createPizza 메소드를추상 메소드로 선언하여서 PizzaStore에 다시 집어 넣는다. 팩토리 패턴은 구상클래스의 적절한 정리방안? 을 해결하기 위해 존재하는 것 같다.
main -> pizzastore 지정 -> pizza 지정 순이다. 자세한건 워크스페이스 폴더를 다시보자. 아직 실전에서는 절대 적용 못할 것 같은 난이도다 ㅜㅜ
팩토리 메소드 패턴 정의는
팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 일이다.
추상 팩토리 패턴 정의는
추상 팩토리 패턴에서는 인터페이스를 이용하여 서로 연관된, 또는 의존하는 객체를 구상 클래스를 지정하지 않고도 생성할 수 있다.
아직 이 두 차이를 글로 읽어도 확실하게 와닿지가 않는다.
화학과제하러가야지...
'공부 기록들' 카테고리의 다른 글
19.11.22 (vector 2차 배열 선언, lower bound, upper bound) (0) | 2019.11.22 |
---|---|
19.11.13 (priority queue, deque) (0) | 2019.11.13 |
19.10.20(C++ 스택, string 입력 받기) (0) | 2019.10.21 |
19.10.19(boj1541) (0) | 2019.10.19 |
19.10.18(char 배열에 대해서) (0) | 2019.10.18 |