#1. [디자인 패턴-생성 패턴] Abstract Factory
Abstract Factory는 특정 그룹 계열에 속한 개체들을 생성합니다. 생성할 개체들이 일련의 그룹인 경우 생성 관련 로직을 간결하게 만들 수 있습니다.
Abstract Factory는 특정 그룹 계열에 속한 개체들을 생성합니다. 생성할 개체들이 일련의 그룹인 경우 생성 관련 로직을 간결하게 만들 수 있습니다.
Builder는 여러 요소가 합성된 개체일 경우 요소를 합성하는 방법과 요소를 생성하는 방법을 분리하여 확장성을 향상시켜 줍니다.
Factory Method는 생성에 대한 구체적인 정보를 자식 클래스에서 알고 있을때 부모 클래스에서 자식 클래스에게 생성을 요청하기 위해 사용합니다.
Prototype은 미리 정의된 개체로부터 복제하여 개체를 생성합니다. 속성까지 동일한 개체를 여러개 만들때 사용하면 좋습니다.
Singleton은 개체가 오직 1번만 생성된다는 것을 코딩 계약으로 보장합니다.
Adapter는 임의의 개체(Adpatee)를 기존 인터페이스로 사용하기 위해 감쌉니다. 개체의 소스코드를 직접 수정할 수 없을때 사용합니다.
Bridge는 추상과 구현을 분리하여, 종속적인 부분을 느슨하게 만들어 주거나, 구현을 다형적으로 만들 수 있게 합니다.
Composite은 단일 개체와 복합 개체를 추상화하여 모두 동일한 방식으로 다루게 해줍니다. 둘을 서로 구분하여 처리할 필요가 없어지기 때문에 고민할 것들이 줄어듭니다.
Decorator는 개체에 동적으로 새로운 외형을 추가하거나 기능을 추가할 때 포함을 통해 처리합니다. 클래스를 직접 수정하거나 상속을 이용하여 추가하는 것보다 코드가 간결해 집니다.
Facade는 서브시스템의 클래스들이 복잡하게 얽혀있고 사용이 어려운 경우, 단순하고 일관된 상위 수준의 통합 인터페이스를 제공합니다. 외부에서 내부 서브시스템을 몰라도 되므로, 사용하기 쉬워집니다.
Flyweight는 동일한 데이터가 반복해서 사용되는 경우 데이터를 공유하여 메모리 효율성을 향상시킵니다.
Proxy는 실제 개체의 동작을 대리해서 실행합니다. 최소한의 정보만을 이용하여 대리 실행하기 때문에, 생성이나 실행시 속도 부하가 있는 개체의 속도 개선을 위해 사용합니다.
Chain of Responsibility는 요청을 여러 개체에 전달하여 함께 처리할 수 있게 해줍니다. 한군데에서 모든 요청을 처리하지 않고 책임에 따라 여러 개체에 분산하므로, 해당 개체 구현시 고민할 것들이 줄어듭니다.
Command는 기능의 요청과 실행을 분리하여, 실행 부분이 재활용될 수 있게 합니다. 동일한 기능을 메뉴, 단축키, 매크로등 여러 방법으로 실행할 수 있을때 사용하면 좋습니다.
Interpreter는 비교적 단순하게 설계된 임의의 언어를 해석하는 간단한 방법을 제공합니다. 파서를 통해 가상의 트리를 만들고 이를 이용하여 구문을 해석합니다.
Iterator는 집합 개체에서 요소에 접근하는 방법을 제공합니다. 집합 개체의 내부 구현을 외부에 은닉하기 때문에 집합 개체의 구현 방식을 비교적 안전하게 변경할 수 있습니다. C++의 경우 STL의 컨테이너는 모두 이터레이터를 제공하며, begin(), end(), ++, * ...
Mediator는 개체들끼리의 상호작용을 캡슐화합니다. 개체들끼리 서로 직접 참조하지 않기 때문에 결합도가 낮아져 유지보수 편의성이 향상됩니다.
Memento는 내부 상태를 저장해 두고 나중에 복원할 수 있게 해줍니다. Command 패턴과 함께 사용되어 Undo를 구현할 수 있습니다.
Observer는 특정 개체를 감시하며, 변경 발생을 통지 받는 일반적인 구조입니다.(개체지향 원칙중 헐리우드 원칙과 유사합니다.)
State는 내부 상태에 따라 다른 동작 방법을 제공합니다. 상태를 처리하는 코드들이 응집되어 상태 처리가 비교적 단순해 집니다.
Strategy는 알고리즘이나 기능등의 전략을 캡슐화하고 런타임에 변경할 수 있게 만들어 줍니다. 외부에서 동작을 결정하고 변경할 수 있어 확장성이 향상됩니다.
Template Method는 부모 개체에서 대략의 뼈대를 구현하여 뼈대 동작을 정규화하고, 자식 개체에서는 최소의 구현만 하게 합니다.
Visitor는 개체를 수정하지 않고도 새로운 기능을 추가할 수 있게 합니다.