Design Pattern(생성 패턴)
💿 UML 화살표
💿 추상 팩토리 패턴
상세화된 서브 클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스 제공
- 한 팩토리에서 여러 객체의 군을 생성
- 이미 구현된 팩토리에서 어떤 종류의 객체를 생성할지 정해짐
- create… 이런식으로 정해져있음 대신 팩토리의 종류가 달라짐
- 구상 클래스에 의존하지 않고 여러 개의 관련된 객체를 하나의 팩토리로 묶음
- 인자에 따라 관련된 객체들을 생성하는 팩토리의 종류가 결정됨
- 만들어질수 있는 팩토리가 정해져 있음 그에따라 만들어지는 Object도 결정됨
- ConcreteFactory와 Client간의 결합도를 낮출 때 사용
- 클래스(Abstract Factory) 레벨에서 포커스를 맞춤
- 각 Product들이 다른 클래스와 함께 사용될 때의 제약사항을 강제할 수 있다.
- 단, 새로운 ConcreteFactory를 추가할 때 많은 작업이 필요하다.
- 추상 팩토리는 Object이다. (팩토리 오브젝트 생성)
- 지역 레퍼런스를 두어 , 외부로부터 Factory 객체를 DI 받아서 위임.
활용성
- 객체가 생성되거나 구성, 표현되는 방식과 무관하게 시스템을 독립적으로 만들고자 할 때
- 여러 제품군 중 하나를 택해서 시스템을 설정해야 하고 한번 구성한 제품을 다른 것으로 대체할 수 있을 때
- 관련된 제품 객체들이 함께 사용되도록 설계되었고 이부분에 대한 제약이 외부에도 지켜지도록 할 때
- 제품에 대한 클래스 라이브러리를 제공하고 그들의 구현이 아닌 인터페이스를 노출시키고 싶을 때ㄴㅇㄹㄴㅇㄹ
구현
- 팩토리를 단일체로 정의
- 제품을 생성
- 확장 가능한 팩토리들을 정의
💿 팩토리 메서드 패턴
객체를 생성하기 위해 인터페이스를 정의하지만. 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브 클래스가 내리도록 합니다.
- 한 팩토리를 상속한 팩토리에서 create 메서드를 재정의 하여 생성할 객체를 정함
- 팩토리 클래스는 언제 필요한 인스턴스를 만들어야 하는지만 알고 있을 뿐 어떤 인스턴스를 생성해야 하는지는 알지 못함
- 한 개의 메서드로 여러 개의 객체를 만듦
- 추상 클래스로 정의된 Creator(Factory) 클래스일 경우 구현을 제공한 서브 클래스를 반드시 정의해야 합니다.
활용성
- 어떤 클래스가 자신이 생성해야 하는 객체의 클래스를 예측할 수 없을 때
- 생성할 객체를 기술하는 책임을 자신의 서브클래스가 지정했으먼 할 때
- 객체 생성의 책임을 몇 개의 보조 서브클래스 가운데 하나에게 위임하고, 어떤 서브클래스가 위임자인지에 대한 정보를 국소화시키고 싶을 떄
구현
- Creator 클래스를 구현
- Creator 클래스를 추상 클래스로 정의하고, 정의한 팩토리 메서드에 대한 구현은 제공하지 않는 경우
- Creator 클래스가 구체 클래스이고 팩토리 메서드에 대한 기본 구현을 제공하는 경우
Tips
- 추상 팩토리 패턴은 팩토리를 만드는 패턴이다. 그리고 팩토리 메서드 패턴은 클래스 안에서 메서드를 어떻게 정의 할 지에 대한 패턴이다 둘은 매우 비슷하지만 적용되는 scope가 다르다.
- 즉 추상 팩토리에 정의된 메서드를 서브 클래스에서 재정의 해서 사용한다면 추상 팩토리 패턴에 사용된 메서드는 팩토리 메서드 패턴이 된다 둘은 공존할 수 있다.
- 추상 팩토리 패턴은 팩토리 메서드를 이용해서 구현할 때가 많다.
💿 빌더 패턴
복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공할 수 있도록 합니다.
활용성
- 복합 객체의 생성 알고리즘이 이를 합성하는 요소 객체들이 무엇인지 이들의 조립 방법에 독립적일 때
- 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야 할 때
💿 원형 패턴
원형이 되는(prototypical) 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본을 복사해서 새로운 객체를 생성합니다.
- Factory 클래스에서 생성할 인스턴스의 원형을 생성하고 Client는 Factory의 make 함수(안에 Clone()이 있음)를 통해 인스턴스 생성가능
- 이러면 팩토리 메서드처럼 Factory의 make를 재정의 하여 사용할 필요가 없음
💿 단일체 패턴
오직 한개의 클래스 인스턴스만을 갖도록 보장하고 이에 대한 전역적인 접근점을 제공합니다.
- 유일하게 존재하는 인스턴스로의 접을을 통제합니다.
- 연산 및 표현의 정제를 허용
- 인스턴스의 개수를 변경하기가 자유롭습니다.
- 클래스의 인스턴스가 오로지 하나임을 만족해야 함
구현
- 서브 클래스의 선택을 유연하게 하려면 조건 분기문을 사용해야함(유연하지 않음)
- 단일체에 대한 Registry를 사용
- 문자열로 정의된 이름을 해당 단일체 인스턴스로 대응시켜 둠
- 단일체가 필요할때 Registry를 뒤져서 이름으로 해당 단일체를 찾아달라고 함