티스토리 뷰

반응형

※ 제 블로그의 포스트들은 제가 부족하여 공부하기 위해서 작성하는 것입니다. 

잘못된 부분이나 추가해야할 내용이 있다면 언제든지 댓글 부탁드리겠습니다.


팩토리 패턴(Factory Pattern) 이란

객체 생성을 캡슐화(Encapsulation)한다.


구상 클래스(Concrete Class)가 아닌 추상 클래스(Abstract Class)나 인터페이스에 맞춰서 코딩할 수 있게 해주는 강력한 기법이다. 

구상 클래스에 대한 불필요한 의존성을 줄여줌으로써 느슨한 결합(Loose Coupling)을 지향한다. 

1. '추상화된 것에 의존하도록 만들어라. 구상클래스에 의존하지 않도록 만든다.’ 법칙에 기인한 패턴 

> 의존성 뒤집기 원칙 (DIP : Dependency Inversion principle)

2. '바뀔 수 있는 부분을 찾아내서 바뀌지 않는 부분하고 분리시켜야 한다'는 원칙에 기인한 패턴



※ 의존성 뒤집기 원칙에 위배되는 객체지향 디자인을 피하는데 도움이 되는 가이드.


 1. 어떤 변수에도 구상 클래스에 대한 레퍼런스를 지정하지 않는다.

     - new 연산자를 사용하면 레퍼런스를 사용하게 되는 것.


 2. 구상 클래스에서 유도된 클래스를 만들지 않는다.

     - 구상클래스에서 유도된 클래스를 만들면 특정 구상 클래스에 의존하게됨, 추상화 된것을 사용해야 함.


 3. 베이스 클래스에 이미 구현되어 있던 메소드를 오버라이드 하지 않는다.

     - 이미 구현되어 있는 메소드를 오버라이드 한다는 것은 애초부터 베이스 클래스가 제대로 추상화 된것이 아니었다고

        볼수있다. 베이스 클래스에서 메소드를 정의할 때는 모든 서브 클래스에서 공유할 수 있는 것만 정의해야함


출처 : http://jusungpark.tistory.com/14

.



팩토리 패턴 구성 요소

1. 생산자(Creator) : 실제로 완성된 제품을 내놓는 객체

2. 제품(Product) : 말그대로 제품. 제품을 만들기 위해서는 내부 재료나 처리 방식등이 필요하다.

3. 구상 클래스 (Concrete Creator) : 생산자에 요청을 받아 Product 를 만드는 공장

4. 재료들(Ingredients) : 제품에 들어가는 모든 재료들. 재료는 다양하게 존재할 수 있고 그중에는 비슷한 속성을 지닌 재료들도 있다.




팩토리 패턴에는 두 종류가 있다.

- 팩토리 메소드 패턴 (Factory Method Pattern)

- 추상 팩토리 패턴 (Abstract Factory Pattern)




1. 팩토리 메소드 패턴 

객체를 생성하기 위한 공통 인터페이스를 생성 후, 클래스의 인스턴스(객체)를 만드는 것은 서브 클래스에 맡김



<위키피디아>



하나의 클래스에 if 나 switch 문 안에 모든 로직이 들어 있는 것을 > 공통 부분을 인터페이스로 추출하여 > 인터페이스를 확장하여 각각의 인스턴스를 생성 > 인스턴스 생성을 담당하는 클래스로 분리하는 것 

까지 팩토리 메소드 패턴이라고 본다.


프로그램에서는 클래스 변경에는 신경 쓸 것 없이, 팩토리에서 반환된 객체만 사용하면 되므로 메인 프로그램 변경을 최소화 할 수 있다.




위 과정을 예시로 풀어보면

피자 스토어에서 모든 것을 담당하던 것을 > 피자 생성 과정을 간단한 매뉴얼로 추출 > 매뉴얼을 참고해서 뉴욕 피자, 시카고 피자, 이탈리아 피자 등(Product)을 만든다 > 피자를 만드는 팩토리를 생성



변경 전 : 피자 스토어 -> 뉴욕 치즈 피자, 뉴욕 야채 피자, 시카고 치즈 피자 등... 모두 생성

변경 후 : 피자 스토어 -> 피자 요청 <- 팩토리에서 어떤 피자인지 확인 후 뉴욕 치즈 피자, 야채 피자, 등을 생성한다.






2. 추상 팩토리 패턴  

제품'군'을 생성하기 위한 인터페이스들을 생성하고, 그 인터페이스를 '구성'하여 사용하도록 한다. 구상 클래스는 서브 클래스에 맡김 


보통 팩토리 메소드를 포함하여 구현하는 경우가 많음

해당 패턴을 적용하면 팩토리 클래스 교체 만으로도 조금 더 유연하게 기능의 수정, 확장에 대처 용이해진다.



<위키피디아>



정의가 조금 어려운데, 정리해보자면 각각을 인터페이스로 좀 더 구체적으로 쪼개는 것이다.



팩토리 인터페이스와 각 팩토리 클래스를 구현 -> 팩토리 클래스 내부에서 인스턴스(product)를 생성 후 반환 -> 인스턴스 내부)도 인터페이스를 확장하 인스턴스들(재료들)로 조합 할 수 있다. (재료들도 재사용 가능하도록) -> 각 프로덕트에서 재료들을 조합하여 사용할 수 있다.


추상 팩토리 패턴은 연관된 서브 클래스를 그룹화할 수 있고 , 따라서 서브 클래스 그룹을 자유롭게 교체할 수 있는 패턴이다.




피자 스토어 -> 뉴욕 스토어, 시카고 스토어, 이탈리아 스토어 등으로 '분점'을 낸다. -> 각각 지역과 피자의 특색에 맞는 팩토리를 만든다. 

-> 치즈 피자, 야채 피자, 페퍼로니 피자의 레시피를 만든다. -> 그 안의 치즈, 도우, 소스, 페퍼로니 등의 '재료를 만드는 걸 분리'하여 각 레시피에서 사용할 수 있도록 한다.

 




참고

http://jusungpark.tistory.com/14

http://unabated.tistory.com/entry/팩토리-패턴Factory-Pattern

http://thekizel.tistory.com/entry/Refactorying-첫번째-예제에서-인상-깊었던-코드

https://ko.wikipedia.org/wiki/팩토리_메서드_패턴



반응형

'개발 > 이론' 카테고리의 다른 글

HTTP Status Code  (0) 2021.05.18
ASP.NET 페이지 Life Cycle  (0) 2019.01.23
[ASP.NET] 파일 형식 등 기본 사항  (0) 2019.01.02
[프로토콜] HTTP/HTTPS/REST  (0) 2018.12.28
[HTTP] 쿠키/세션/캐시의 차이점은?  (3) 2018.12.19
댓글