salsa source

[디자인패턴]클래스다이어그램(1) 생성패턴 - 빌더, 추상팩토리, 팩토리메소드, 싱글톤 본문

STUDY/디자인패턴

[디자인패턴]클래스다이어그램(1) 생성패턴 - 빌더, 추상팩토리, 팩토리메소드, 싱글톤

dayofday 2018. 4. 2. 00:33


디자인패턴을 공부하면서 여러 게시글과 다양한 예제들을 보아왔지만 결국 기초가 되는건 디자인패턴의 기본 뼈대임을 깨달았다. 예제는 예시로써 이해를 도울 뿐이다. 결국 개념을 잡기 위해서는 기본 구조에 더욱 충실해야한다. 기본 구조를 가장 잘 나타내고 한 눈에 보기 쉽게 나타내는 것은 클래스 다이어그램이라고 생각한다. 그래서 내가 공부한 몇 개의 디자인패턴의 클래스 다이어그램과, 거기에 각 클래스에 대한 설명을 달아보려 한다.


디자인패턴은 크게 세 가지 종류로 나뉜다.  [ 생성패턴, 행위패턴, 구조패턴 ]

앞으로 이 세 가지 분류를 기준으로 주요 디자인패턴의 클래스다이어그램과 간략한 설명을 정리해보도록 하겠다.










생성패턴


인스턴스를 만드는 절차를 추상화 한 패턴

합성하는법, 객체의 표현방법 과 시스템을 분리한 패턴


클래스생성패턴 : 인스턴스로 만든 클래스를 다양화하기 위해 상속을 사용 > 팩토리메소드패턴

객체 생성패턴 : 인스턴스화 작업을 다른 객체에 넘김 > 추상팩토리패턴, 빌더패턴









빌더패턴(Builder Pattern)


- 하나의 객체 생성 시 객체의 구성요소들을 분리하여 객체의 세부 구성요소 클래스들을 별도로 만들고 

  그 구성요소 클래스들을 조합하여 하나의 객체를 만드는 것

- 복합 객체의 생성과정과 표현방법을 분리하여 생성절차에서 다른 표현결과를 만드는 패턴


즉, 서로 다른 표현이지만 동일한 구축 공정을 사용한다!




언제 사용하나?

- 생성자에 인자가 많을 때

- 복합 객체의 생성 알고리즘과 이를 합성하는 요소 객체들이 조립방법에 독립적일 때

- 합성할 객체의 표현이 서로 달라도 생성절차에서 지원해야 할 때





필요한 객체를 직접 생산하는 대신 필수 인자들을 생성자나 정적팩토리메소드에 넣어 빌더 객체를 만든다.

그런 다음 빌더 객체에 정의된 설정 메서드들을 호출하여 선택적 인자들을 추가해나간다.

마지막으로 아무런 인자 없이 Build 메소드를 호출하여 객체를 만든다.



활용 예시

- 안드로이드 alertDialog  링크

- java JDK 안의 예시들  링크



* 연관 패턴 : 템플릿메소드패턴, Composite 패턴, Facade 패턴



참고 :  http://idea-sketch.tistory.com/21        http://tadis.tistory.com/entry/7-생성패턴-2-빌더-Builder-1












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


- 객체를 구성하는 부분을 추상화하고, 여러 서브 클래스가 상속을 통해 구현하여 구성하는 부분을 동일하게 유지하는 방법

- 객체를 구성하는 클래스가 생성공정은 동일하고 구현 내용이 다를 때 메소드를 추상화하여 사용하는 방법

- 상세화 된 서브클래스를 정의하지 않고도 서로 관련있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공하기 위하여





1) Client가 ConcreteFactory1,2 클래스를 이용하여 각 Product들을 객체로 인스턴스화 한다.

2) ConcreteFactory1,2는 인터페이스 AbstractFactory를 참조한다.

3) ConcreteFactory가 Product 클래스들을 인스턴스화하여 객체를 생성한다.


활용 예시

- JDK. 예시들 링크





* 연관 패턴 : 팩토리 패턴, 빌더 패턴



참고 : http://jinsprogramming.wikispaces.com/Abstract+factory+pattern?showComments=1

  http://leetaehoon.tistory.com/58                  https://wikidocs.net/898

  http://palpit.tistory.com/190












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


- 객체를 만들어내는 공장을 만드는 패턴

- 클래스의 인스턴스를 만드는 일을 서브클래스에 위임




1) Contract는 Product 타입의 객체를 반환하는 메소드 선언

2) Contract Creator 클래스는 팩토리 메소드를 재정의하여 ConcreteProduct 인스턴스 반환


활용 예시

- JDK  링크




*연관 패턴

  ** Factory Method 패턴은 Template Method 패턴에서 발전된 형태

  ** 추상팩토리패턴, 빌더 패턴에서 참조



참고 : https://jinsprogramming.wikispaces.com/Factory+method+pattern   

        http://effectiveprogramming.tistory.com/entry/Factory-Method-%ED%8C%A8%ED%84%B4-1

  http://yardbirds.tistory.com/20









참고!!

      추상팩토리와 팩토리메소드 패턴의 차이점 링크





싱글톤패턴(Singleton Pattern)


- 해당 클래스의 인스턴스가 오직 하나 뿐임을 보장하고, 이에 대한 전역적인 접근점을 제공하기 위함





사용이유

- 메모리 낭비 방지

- 싱글톤 클래스 인스턴스가 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉬움

- 공통된 객체를 여러 개 생성하여 사용해야하는 경우에 많이 사용 (스레드풀, 캐시, 대화상자, 사용자 설정, 로그 기록 객체 등)

- 안드로이드 앱에서 각 액티비티/클래스 별 주요 클래스들을 일일이 전달하기 번거로울 때 사용


단점

- 싱글톤 인스턴스가 하는 일이 너무 많거나 많은 데이터를 공유하면 다른 인스턴스간 결합도가 높아져 개방-폐쇄 원칙을 위배할 수 있음

  >> 수정 및 테스트가 어려워짐

- 멀티스레드 환경일 때 동기화를 안하면 인스턴스가 두 개 생성될 수 있다. 




활용 예시

- 안드로이드 Calender.getInstance();

- Log 클래스

- 안드로이드의 ~~Manager   링크





참고 : https://www.slideshare.net/lahuman1/desing-pattern-44038494   >> 여러 상황 별 해결방법 알고리즘 있음!





참고 사이트

https://books.google.co.kr/books?id=AiieDgAAQBAJ&pg=PT180&lpg=PT180&dq=%EC%B6%94%EC%83%81+%ED%8C%A9%ED%86%A0%EB%A6%AC+%ED%8C%A8%ED%84%B4+spring+%EC%98%88%EC%8B%9C&source=bl&ots=RowQnZ9a34&sig=kBjhuyrhDHJNCvCuvVLonzqgaVk&hl=ko&sa=X&ved=0ahUKEwjSwdiWo8DaAhXBrJQKHXPmBx04ChDoAQhnMAk#v=onepage&q=%EC%B6%94%EC%83%81%20%ED%8C%A9%ED%86%A0%EB%A6%AC%20%ED%8C%A8%ED%84%B4%20spring%20%EC%98%88%EC%8B%9C&f=false



Comments