본문으로 바로가기

4. Factory Pattern


4.1 'new' 연산자를 사용한다는 것의 의미.

new 연산자를 사용한다는 것은 구상 클래스의 인스턴스를 만드는 것을 의미

구상 클래스를 바탕으로 코딩을 하면 결합도가 높아져 추후 코드를 수정해야 할 가능성이 높아짐


4.1.1 new 연산자의 문제일까?

객체를 만들기 위해서는 언젠가 반드시 new 연산자를 사용할 수 밖에 없기 때문에 new 연산자 자체에는 문제가 없음.


4.1.2 해결방법

새로운 구상 클래스가 추가,삭제될 때 마다 기존의 구현 위주로 프로그래밍한 코드를 수정해줘야한다. == 인스턴스 생성은 변화하는 부분

바뀌는 부분을 바뀌지 않는 부분으로 부터 분리해 캡슐화한다는 디자인 원칙에 따라 객체 생성부분을 분리하여 캡슐화한다.


4.2 Factory Pattern의 종류

1)Simple Factory

2)Factory Method Pattern

3)Abstract Factory Pattern 


4.3 Pizza Store

피자를 만드는 피자가게


4.3.1 구현 클래스 위주의 Pizza Store

구현 클래스를 위주로 코딩을 할 경우 어떤 문제가 생기는지 보여드릴게요.

(구현 클래스의 인스턴스 생성부분의 설명을 위한 것이니 구체적인 메소드를 정의하진 않았습니다)


4.3.1.1 Base class

피자를 주문하면 만드는 Base class입니다.

=> Product class의 instance를 반환하는 Base class


4.3.1.1.1 수정사항이 발생

Base class에서 사용하는 Product class 즉, 구상 클래스에 수정사항이 발생했습니다.

- CheesePizza는 그대로입니다.

- pepperoniPizza가 인기가 없어 제외됩니다.

- GarlicPizza가 새롭게 추가됩니다. 


4.3.1.1.2 수정사항이 발생할 경우의 문제

Base class에서 구현 클래스의 인스턴스 위주로 코딩을 했기 때문에 새로운 구상 클래스가 추가되거나 기존의 구상 클래스가 삭제되면

Base class를 수정해야한다.


4.3.1.2 Product interface

Product class들이 구현해야 하는 메소드들을 제시하는 인터페이스 입니다.


4.3.1.3 Product class

Base class에서 사용할 클래스입니다.


4.3.1.4 Test class


4.3.2 Simple Factory를 이용한 Pizza Store


4.3.2.1 Simple Factory?

디자인 패턴은 아니지만 자주 사용되는 프로그래밍 기법.


4.3.2.2 Base class

구상 클래스의 인스턴스 생성은 변화하는 부분이기 때문에 Base class에서 따로 분리해서 캡슐화 한다. 


4.3.2.3 SimpleFactory class

Base class에서 분리된 구상 클래스의 인스턴스 생성부분을 캡슐화한 클래스


4.3.2.4 구상 클래스의 인스턴스 생성부분을 분리하기 전과 분리한 후의 차이를 못느끼겠어요.

아니 어차피 새로운 구상 클래스가 추가되거나 기존의 구상 클래스가 삭제되면 Factory class를 수정해야하는건 똑같은데 도대체 뭐가 다른가?

Base class를 수정해야하는 일이 발생하면 우리는 유연성이 없다고 표현합니다.

Base class에서 우리는 다른 여러가지 추가적인 코딩을 할건데 그러한 Base class에서 수정사항이 발생하면 전부다 고쳐야하는 문제가 생깁니다.

하지만 Factory class에는 다른 여러가지 코드가 없어요. 즉, 바뀌기 때문에 분리해 놓은 부분만 집중되어 있기때문에 코드를 수정한다해도 다른 변경사항이 나비효과 처럼 생기지 않습니다.

'Design Pattern > Head FIrst Design Pattern' 카테고리의 다른 글

7. Adaptor Pattern  (0) 2019.05.23
6. Command Pattern  (0) 2019.05.20
3. Decorator Pattern  (0) 2019.04.21
2. Observer Pattern  (0) 2019.04.21
1. Strategy Pattern  (0) 2019.04.15