프로그래밍/Design Pattern

GoF의 디자인 패턴 - 생성 패턴

seungdols 2015. 10. 12. 14:05


생성 패턴


- 인스턴스를 만드는 절차를 추상화하는 패턴이다.

객체를 생성,합성하는 방법이나 객체의 표현 방법과 시스템을 분리시켜 준다.


클래스 생성 패턴이 인스턴스로 만들 클래스를 다양하게 만들기 위한 용도로 상속을 사용하는 반면,

객체 생성 패턴은 인스턴스화 작업을 다른 객체에게 떠넘길 수도 있다.


* 생성 패턴을 따라 다니는 두 가지

1. 생성 패턴은 시스템이 어떤 구체 클래스를 사용하는지에 대한 정보를 캡슐화합니다.


2. 생성 패턴은 이들 클래스의 인스턴스들이 어떻게 만들고 어떻게 서로 맞붙는지에 대한 부분을 

완전히 가려줍니다.


결론적으로 생성 패턴을 이용하면, 무엇이 생성되고 누가 생성하는지, 언제 생성 하는지, 어떻게 생성 되는지에 대해 결정하는데 유연성을 제공해준다.



추상 팩토리 

접미어 

 - Kit


의도 


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


활용

* 이런 상황에서 사용하는 것이 좋다.


- 객체가 생성되거나 구성/표현되는 방식과 무관하게 시스템을 독립적으로 만들 때

- 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한 번 구성한 제품을 다른 것으로 대체 할 수 있을 때

- 관련된 제품 객체들이 함께 사용 되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때

- 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출 시키고 싶을 때


이점 


- 구체적인 클래스를 분리한다.

- 제품군을 쉽게 대체 할 수 있다.

- 제품 사이의 일관성을 증진 시킨다.


단점


- 새로운 종류의 제품을 제공하기가 어렵다.



빌더 

의도 

 - 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 

서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 한다.


활용 

* 이런 상황에서 사용하는 것이 좋다.


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

- 합성 할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때


이점 


- 제품에 대한 내부 표현을 다양하게 변화할 수 있다.

- 생성과 표현에 필요한 코드를 분리 한다.

- 복합 객체를 생성하는 절차를 좀 더 세밀하게 나눌 수 있다.


실제 예시로 보자.




2015/09/21 - [Java/Java] - 생성자 인자가 많을때 어떤 패턴을 써야 하나?




팩토리 메서드 (가상 생성자 Virtual Contructor)

의도 


- 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성 할지에 대한 결정은 서브 클래스가 내리도록 한다.


활용 

* 이런 상황에서 사용하는 것이 좋다.


- 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때

- 생성할 객체를 기술하는 책임을 자신의 서브 클래스가 지정 했으면 할 때

- 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브 클래스가 위임자인지에 대한 정보를 

최소화 하고 싶을 때 


이점


- 서브 클래스에 대한 Hook method를 제공한다.

- 병렬적인 클래스 계통을 연결하는 역할을 담당한다.



원형 ( Prototype ) 

의도 


- 원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다.


활용

* 이런 상황에서 사용하는 것이 좋다.


- 프로토타입 패턴은 제품의 생성, 복합, 표현 방법에 독립적인 제품을 만들고자 할 때 사용 한다.

- 인스턴화할 클래스를 런타임에 지정 할 때

- 제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피하고 싶을 때

- 클래스의 인스턴스들이 서로 다른 상태 조합 중에 어느 하나일 때


이점 


- 런타임에 새로운 제품을 추가하고 삭제 할 수 있다.

- 값들을 다양화함으로써 새로운 객체를 명세한다.

- 구조를 다양화함으로써 새로운 객체를 명세 할 수 있다.

- 서브클래스의 수를 줄인다.

- 동적으로 클래스에 따라 응용 프로그램을 설정 할 수 있다.


* 프로토타입 패턴과 추상 팩토리 패턴은 어떤 면에서 경쟁 관계로 볼 수 있으나, 함께 사용 되기도 한다.

복합체 패턴, 장식자 패턴을 많이 쓰는 경우에 프로토타입 패턴을 쓰면 유용하다.



단일체(Singleton)  패턴

의도


- 오직 한 개의 클래스 인스턴스만 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공한다.


활용

* 이런 상황에서 사용하는 것이 좋다.


- 클래스의 인스턴스가 오직 하나여야 함을 보장하고, 잘 정의된 접근점(Accecss point)으로 모든 사용자가 접근할 수 있도록 해야 할 때

- 유일한 인스턴스가 서브클래싱으로 확장되어야 하며, 사용자는 코드의 수정 없이  서브클래스의 인스턴스를 사용 할 수 있어야 할 때


이점 

- 유일하게 존재하는 인스턴스로의 접근을 통제한다.

- 이름 공간을 좁혀준다.

- 연산 및 표현의 정제를 허용한다.

- 인스턴스의 개수를 변경하기가 자유롭다.

- 클래스 연산을 사용하는 것보다 훨씬 유연하다.


고려사항 


1. 인스턴스가 유일해야 함을 보장해야 한다.

- 단일체를 전역 변수/정적 객체로 정의하고 이를 자동으로 초기화 하는 것은 옳지 않다.

1. 정적 객체의 유일한 인스턴스만 선언되리라는 보장이 없다. 

(정적 객체에서 인스턴스를 얻는 선언문이 프로그램 다른 부분에 존재하더라도 이를 확인하고 방지 할 수 ㅇ)

2. 정적 초기화 시점에 모든 단일체를 인스턴스화하기 위해 필요한 모든 정보가 없을 수 있다.

3. C++에서는 전역 객체에 대한 생성자를 언제 호출하는지에 대한 명확한 순서를 정의하지 않

는다. (이 말은 단일체 사이에는 어떤 종속성도 없다는 이야기)

2. Singleton class를 서브 클래싱 한다.

Singleton 의 인스턴스를 참조하는 쉬운 방법은 Singleton 클래스의 Instance() 연산을 해야 한다.





  •  무단 수정 및 배포는 금지합니다. 
  •  모든 내용은 본 블로그 운영자가 정리한 내용입니다. 
  •  참조한 정보에 대해서는 출처를 남기고 있습니다.
  •  틀린 내용 / 오류가 포함된 내용은 댓글로 남겨주세요.
  •  choiseungho0822@gmail.com 보내주셔도 됩니다.
  •  Seungdols Wiki 운영중입니다.


반응형