Creational Patterns(생성 패턴) :: Singleton(단일체)
구분
객체 생성 (Object Creational)
의도
- 오직 한 개의 클래스 인스턴스만을 갖도록 보장하고, 이에 대한 전역적인 접근점을 제공한다.
사용시기
- 클래스의 인스턴스가 오직 하나여야 함을 보장하고, 잘 정의된 접근점(access point)으로 모든 사용자가 접근할 수 있도록 해야 할 때
- 유일한 인스턴스가 서브클래싱으로 확장되어야 하며, 사용자는 코드의 수정없이 확장된 서브클래스의 인스턴스를 사용할 수 있어야 할 때
장점과 단점
1. 유일하게 존재하는 인스턴스로의 접근을 통제한다.
2. 이름 공간(namespace)을 좁힌다.
3. 연산 및 표현의 정제를 허용한다.
4. 인스턴스의 개수를 변경하기가 자유롭다.
5. 클래스 연산을 사용하는 것보다 훨씬 유연한 방법이다.
구현의 유의점
1. 인스턴스의 유일함을 보장해야 한다.
2. Singleton 클래스를 서브클래싱한다.
관련 패턴
많은 패턴이 Singleton패턴으로 구현될 수 있다.
참조문헌
- GoF의 디자인패턴
2016년 2월 24일 수요일
GoF의 디자인 패턴 - Prototype
Creational Patterns(생성 패턴) :: Prototype(원형)
구분
객체 생성 (Object Creational)
의도
- 원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성한다.
사용시기
- 인수턴스할 클래스를 런타임에 지정할 때
- 제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피하고 싶을 때
- 클래스의 인스턴스들이 서로 다른 상태의 조합 중에 어느 하나일 때
- 미리 원형으로 초기화해 두고, 나중에 이를 복제해서 사용하는 것이 매번 필요한 상태 조합의 값들을 수동적으로 초기화하는 것보다 더 편리하다.
장점과 단점
1. 런타임에 새로운 제품을 추가하고 삭제할 수 있다.
2. 값들을 다양화함으로써 새로운 객체를 명세한다.
3. 구조를 다양화함으로써 새로운 객체를 명세할 수 있다.
4. 서브클래스의 수를 줄일 수 있다.
5. 클래스에 따라 동적으로 응용프로그램을 설정할 수 있다.
구현의 유의점
1. 원형 관리자를 사용한다.
2. Clone() 연산을 구현한다.
3. Clone() 을 초기화한다.
관련 패턴
Composition, Decorator 패턴에서 Prototype패턴을 쓰는 것을 추천함
참조문헌
- GoF의 디자인패턴
구분
객체 생성 (Object Creational)
의도
- 원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성한다.
사용시기
- 인수턴스할 클래스를 런타임에 지정할 때
- 제품 클래스 계통과 병렬적으로 만드는 팩토리 클래스를 피하고 싶을 때
- 클래스의 인스턴스들이 서로 다른 상태의 조합 중에 어느 하나일 때
- 미리 원형으로 초기화해 두고, 나중에 이를 복제해서 사용하는 것이 매번 필요한 상태 조합의 값들을 수동적으로 초기화하는 것보다 더 편리하다.
장점과 단점
1. 런타임에 새로운 제품을 추가하고 삭제할 수 있다.
2. 값들을 다양화함으로써 새로운 객체를 명세한다.
3. 구조를 다양화함으로써 새로운 객체를 명세할 수 있다.
4. 서브클래스의 수를 줄일 수 있다.
5. 클래스에 따라 동적으로 응용프로그램을 설정할 수 있다.
구현의 유의점
1. 원형 관리자를 사용한다.
2. Clone() 연산을 구현한다.
3. Clone() 을 초기화한다.
관련 패턴
Composition, Decorator 패턴에서 Prototype패턴을 쓰는 것을 추천함
참조문헌
- GoF의 디자인패턴
2016년 2월 23일 화요일
GoF의 디자인 패턴 - Factory Method
Creational Patterns(생성 패턴) :: Factory Method(팩토리 메서드)
구분
클래스 생성 (Class Creational)
의도
- 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할 지에 대한 결정은 서브클래스가 한다.
사용시기
- 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
- 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
- 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화(localization)시키고 싶을 때
관련 패턴
Factory Method는 Abstract Factory 패턴과 Template Method 패턴에서 사용될 때가 많다.
참조문헌
- GoF의 디자인패턴
구분
클래스 생성 (Class Creational)
의도
- 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할 지에 대한 결정은 서브클래스가 한다.
사용시기
- 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
- 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으면 할 때
- 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화(localization)시키고 싶을 때
관련 패턴
Factory Method는 Abstract Factory 패턴과 Template Method 패턴에서 사용될 때가 많다.
참조문헌
- GoF의 디자인패턴
GoF의 디자인 패턴 - Builder
Creational Patterns(생성 패턴) :: Builder(빌더)
구분
객체 생성 (Object Creational)
의도
- 복잡한 객체를 생성하는 방법과 표현하는 방법의 정의하는 클래스를 별도로 분리하여 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 한다.
사용시기
- 복합 객체의 생성 알고리즘이 복합 객체를 합성하는 요소 객체들과 상관없이 독립적일 때
- 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때
장점과 단점
1. 제품에 대한 내부 표현을 다양화 시킬 수 있다.
2. 생성과 표현에 필요한 코드의 분리
관련 패턴
복잡한 객체의 생성에 있어서 추상 팩토리 패턴과 빌더 패턴은 비슷하다.
차이가 있다면, 빌더 패턴은 복잡한 객체의 단계별 생성에 중점을 둔 반면, 추상 팩토리 패턴은 제품의 유사군들이 존재할 때 유연한 설계에 중점을 둔다.
빌더 패턴은 생성의 마지막 단계에서 생성한 제품을 반환하는 반면, 추상 패토리 패턴은 만드는 즉시 제품을 반환한다. 제품 하나만으로도 의미가 있기 때문이다.
참조문헌
- GoF의 디자인패턴
구분
객체 생성 (Object Creational)
의도
- 복잡한 객체를 생성하는 방법과 표현하는 방법의 정의하는 클래스를 별도로 분리하여 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 한다.
사용시기
- 복합 객체의 생성 알고리즘이 복합 객체를 합성하는 요소 객체들과 상관없이 독립적일 때
- 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때
장점과 단점
1. 제품에 대한 내부 표현을 다양화 시킬 수 있다.
2. 생성과 표현에 필요한 코드의 분리
관련 패턴
복잡한 객체의 생성에 있어서 추상 팩토리 패턴과 빌더 패턴은 비슷하다.
차이가 있다면, 빌더 패턴은 복잡한 객체의 단계별 생성에 중점을 둔 반면, 추상 팩토리 패턴은 제품의 유사군들이 존재할 때 유연한 설계에 중점을 둔다.
빌더 패턴은 생성의 마지막 단계에서 생성한 제품을 반환하는 반면, 추상 패토리 패턴은 만드는 즉시 제품을 반환한다. 제품 하나만으로도 의미가 있기 때문이다.
참조문헌
- GoF의 디자인패턴
GoF의 디자인 패턴 - Abstract Factory
Creational Patterns(생성 패턴) :: Abstract Factory(추상 팩토리)
구분
객체 생성 (Object Creational)
의도
상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공
사용시기
- 객체가 생성되거나 구성/표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
- 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을 때
- 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
- 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때
장점과 단점
1. 구체적인 클래스의 분리
- 추상 팩토리 패턴을 쓰면 응용프로그램이 생성 할 객체의 클래스를 제어할 수 있다. 팩토리는 제품 객체를 생성하는 과정과 책임을 캡슐화한 것이기 때문에 구체적인 구현 클래스가 사용자로부터 분리된다. 일반 프로그램은 추상 인터페이스를 통해서만 인스턴스를 조작한다. 제품 클래스 이름이 구체 팩토리의 구현에서 분리되므로 사용자 코드에는 나타나지 않는다.
2. 제품군을 쉽게 대처할 수 있다.
- 구체 팩토리의 클래스는 응용프로그램에서 한 번만 나타나기 때문에 응용프로그램이 사용할 구체 팩토리를 변경하기 쉽다. 또한, 구체 팩토리를 변경함으로써 응용프로그램은 서로 다른 제품을 사용할 수 있게 변경된다. 추상 패고리는 필요한 모든 것을 생성하기 때문에 전체 제품군은 한번에 변경이 가능하다.
3. 제품 사이의 일관성 확보
- 하나의 군 안에 속한 제품 객체들이 함께 동작하도록 설계되어 있을 때, 응용프로그램은 한 번에 오직 한 군에서 만든 객체를 사용하도록 함으로써 프로그램의 일관성을 갖도록 할 수 있다.
4. 새로운 종류의 제품의 제공이 어려움
- 새로운 종류의 제품을 만들기 위해 기존 추상 팩토리를 확장하기가 어렵다. 생성되는 제품은 추상 팩토리가 생성할 수 있는 제품 집합에만 고정되어 있기 때문이다. 만약 새로운 종류의 제품이 등장하면 팩토리의 구현을 변경해야 한다. 이는 추상 팩토리와 모든 서브클래스의 변경을 가져온다. 즉, 인터페이스가 변경되는 새로운 제품을 생성하는 연산이 추가되거나, 기존 연산의 반환 객체 타입이 변경되므로 이를 상속받는 서브클래스 모두가 변경되어야 한다.
구현의 유의점
1. 팩토리를 단일체로 정의한다.
2. 제품을 생성한다.
3. 확장 가능한 팩토리들을 정의한다.
참조문헌
- GoF의 디자인패턴
구분
객체 생성 (Object Creational)
의도
상세화된 서브클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공
사용시기
- 객체가 생성되거나 구성/표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
- 여러 제품군 중 하나를 선택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을 때
- 관련된 제품 객체들이 함께 사용되도록 설계되었고, 이 부분에 대한 제약이 외부에도 지켜지도록 하고 싶을 때
- 제품에 대한 클래스 라이브러리를 제공하고, 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때
장점과 단점
1. 구체적인 클래스의 분리
- 추상 팩토리 패턴을 쓰면 응용프로그램이 생성 할 객체의 클래스를 제어할 수 있다. 팩토리는 제품 객체를 생성하는 과정과 책임을 캡슐화한 것이기 때문에 구체적인 구현 클래스가 사용자로부터 분리된다. 일반 프로그램은 추상 인터페이스를 통해서만 인스턴스를 조작한다. 제품 클래스 이름이 구체 팩토리의 구현에서 분리되므로 사용자 코드에는 나타나지 않는다.
2. 제품군을 쉽게 대처할 수 있다.
- 구체 팩토리의 클래스는 응용프로그램에서 한 번만 나타나기 때문에 응용프로그램이 사용할 구체 팩토리를 변경하기 쉽다. 또한, 구체 팩토리를 변경함으로써 응용프로그램은 서로 다른 제품을 사용할 수 있게 변경된다. 추상 패고리는 필요한 모든 것을 생성하기 때문에 전체 제품군은 한번에 변경이 가능하다.
3. 제품 사이의 일관성 확보
- 하나의 군 안에 속한 제품 객체들이 함께 동작하도록 설계되어 있을 때, 응용프로그램은 한 번에 오직 한 군에서 만든 객체를 사용하도록 함으로써 프로그램의 일관성을 갖도록 할 수 있다.
4. 새로운 종류의 제품의 제공이 어려움
- 새로운 종류의 제품을 만들기 위해 기존 추상 팩토리를 확장하기가 어렵다. 생성되는 제품은 추상 팩토리가 생성할 수 있는 제품 집합에만 고정되어 있기 때문이다. 만약 새로운 종류의 제품이 등장하면 팩토리의 구현을 변경해야 한다. 이는 추상 팩토리와 모든 서브클래스의 변경을 가져온다. 즉, 인터페이스가 변경되는 새로운 제품을 생성하는 연산이 추가되거나, 기존 연산의 반환 객체 타입이 변경되므로 이를 상속받는 서브클래스 모두가 변경되어야 한다.
구현의 유의점
1. 팩토리를 단일체로 정의한다.
2. 제품을 생성한다.
3. 확장 가능한 팩토리들을 정의한다.
참조문헌
- GoF의 디자인패턴
2016년 2월 15일 월요일
GoF의 디자인 패턴
1. Creational Patterns(생성 패턴)
- Abstract Factory(추상 팩토리)
- Builder(빌더)
- Factory Method(팩토리 메서드)
- Prototype(원형)
- Singleton(단일체)
2. Structural Patterns(구조 패턴)
- Adapter(적응자)
- Bridge(가교)
- Composite(복합체)
- Decorator(장식자)
- Facade(퍼사드)
- Flyweight(플라이급)
- Proxy(프록시)
3. Behavioral Patterns(행동 패턴)
- Chain of Responsibility(책임 연쇄)
- Command(명령)
- Interpreter(해석자)
- Iterator(반복자)
- Mediator(중재자)
- Memento(메멘토)
- Observer(감시자)
- State(상태)
- Strategy(전략)
- Template Method(템플릿 메서드)
- Visitor(방문자)
총 23개의 디자인 패턴.... 하나씩 풀어보자. 실전에 적용해보며~
참조문헌
- GoF의 디자인패턴
피드 구독하기:
글 (Atom)