디자인 패턴 27

[디자인 패턴] 구조 패턴 (2) 가교 Bridge

가교 (Bridge) 패턴 1. 의도 개체의 틀(Handle)과 내용(Body)을 분리하여 다른 클래스 계통을 가지게 함 2. 활용 예시 Window - WindowImp Window 창에 대한 인터페이스를 제공하는 Window 클래스가 있고 같은 계통으로 상속할 수 있는 클래스가 있다. 1. Window 창 종류의 변화 Icon을 표시하는 창이거나 잠시 로그인으로 띄우는 Transient 임시 창일 수도 있다. 2. Window 창을 그리는 시스템 환경 Window를 X Window 시스템이나 PM Window 시스템에서 그릴 수 있다. IconWindow이면서 X Window환경에서 그리려면 어떻게 해야할까 IconWindow를 서브 클래싱하는 IconXWindow 클래스를 정의함으로 해결할 할 수 ..

[디자인 패턴] 구조 패턴 (1) 적응자 Adapter

적응자 (Adapter) 패턴 1. 의도 다른 클래스의 인터페이스를 가져와서 새로 만들거나 기존에 있던 클래스에 추가하는 것 2. 활용 기존 클래스에서 기능을 추가해야하나 상위 추상 클래스를 손보고 싶지 않을 때 다른 클래스에서 기능을 가져오되 다른 클래스 역시 수정하고 싶지 않을 때 한마디로 두 개의 인터페이스를 다중 상속하여 두 기능을 갖고 싶을 때 적용 예시 TextShape와 TextView 추상 클래스 Shape를 상속받는 Line과 TextShape 객체가 있는데 이들은 특정 모양을 나타내고 그래픽 요소로서 Client가 화면에 그리기 위한 기본 객체이다. 객체의 바운더리를 얻는 BoundingBox() 메서드와 이 객체를 다루는 핸들러?를 반환하는 CreateManipulator()가 있다...

[디자인 패턴] 생성 패턴 (5) 싱글톤 Singleton (2021.02.19 수정)

싱글톤 (단일체-Singleton) 패턴 1. 의도 프로그램 상 인스턴스가 하나만 있음을 보장. 전역적인 접근이 가능하다. 2. 활용 프로그램 전체에서 인스턴스가 하나만 있고 모든 사용자가 접근 가능하도록 만든다. 3. 참여자 Singleton: Instance() 연산을 정의하여 유일한 인스턴스에 접근한다. Instance() 연산은 정적 멤버 함수로 구현하여 모든 사용자가 접근할 수 있도록 한다. 4. 협력 방법 사용자는 instance() 연산을 이용하여 단일체 인스턴스에 접근할 수 있다. 5. 결과 유일한 존재를 보장하고 인스턴스 접근을 통제한다. 전역 변수로 선언을 피함으로 이름 공간 혼란을 줄일 수 있다. 6. 구현 예시 코드로 설명 Instance(): 단일체인 자신을 반환하는 접근자 Rel..

[디자인 패턴] 생성 패턴 (4) 원형 Prototype

원형 (Prototype) 패턴 1. 의도 객체를 복사하여 사용하는 것. 복사할 객체의 클래스를 명시한다. 2. 활용 인스턴스화할 클래스를 런타임에 지정할 때 팩토리 메서드에서 객체 합성으로 클래스 계통을 연결 하였는 데 이를 피하고 싶을 때 원형 복제를 먼저하고 나중에 초기화 하여 자세히 설정된 객체를 사용하고 싶을 때 주로 인스턴스의 상태가 유한한 경우 복제하여 초기화하는 것이 유용할 수 있다. Graphic 객체와 Graphic Tool 객체 팩토리 메서드에서 기능 분리 등으로 서브 클래스에서 객체를 합성하여 인스턴스를 생성하였다. 하지만 생성하는 클래스가 다를 경우 팩터리 메서드를 상속하는 ImageGraphicTool, WidgetGraphicTool... 등 새로운 서브클래스를 만들어야 했는데..

[디자인 패턴] 생성 패턴 (3) 팩토리 메서드 Factory Method

팩토리 메서드 (Factory Method) 1. 의도 객체를 생성하기 위한 인터페이스를 정의하지만 인스턴스 생성은 자신의 서브클래스이 하도록 함 2. 활용 추상 객체에서 어떤 객체를 생성(포함)해야하는지 모르기 때문에 객체의 생성을 서브 클래스가 하도록 미룬다. 문서와 어플리케이션의 예시 Application 객체는 Document 객체를 새로 만들거나(New) 기존에 있던 것을 여는(Open) 연산을 한다. NewDocument()의 함수 예시에서 Document* doc = CreateDocument();와 같이 CreateDocument() 함수를 이용하여 Document를 생성할 수 있다. 만약 추상적 Document를 생성하는 것이 아니라 회계를 위한 장부, 회의록, 일정 등등 Document..

[디자인 패턴] 생성 패턴 (1) 추상 팩토리 Abstract Factory

추상 팩토리 (Abstract Factory) 1. 의도 상세한 서브 클래스를 정의하지 않고 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기 위한 인터페이스를 제공 한마디로 공통 특징을 가지는 객체를 생산하기 위한 포괄적인 "공장" 객체이다. 2. 활용 비슷한 특징을 가지는 제품을 하나의 제품군으로 묶고 추상 팩토리 클래스에서 생성자를 정의하지 않고 객체를 생성하는 인터페이스(가상 함수)를 제공 각 제품을 만드는 구체 팩토리(Concrete Factory)는 추상 팩토리(Abstract Factory)를 상속받아 제품에 대한 생성하는 인터페이스를 구현 사용자는 구체적인 제품 명을 알 필요 없이 제품군이 공통적으로 가지는 인터페이스를 통해 조작 ex) Widget을 찍어내는 WidgetFactor..

[디자인 패턴] 생성 패턴 (2) 빌더 Builder

빌더 (Builder) 1. 의도 비슷한 생산 절차를 가지는 객체들을 묶어 Builder를 통해 추상화하고 동일한 절차를 제공할 수있도록 한다. 2. 활용 생산 절차는 비슷하지만 생성된 객체들은 서로 독립적인 경우 (공통으로 상속하는 추상 클래스가 없어도 된다.) cf) 추상 팩토리 - 한 팩토리릍 통해 생산된 객체는 다른 팩토리에서 생산된 객체와 공통으로 상속하는 추상 클래스가 존재한다. 따라서 표현이 다르지만 생산 절차가 비슷하기 때문에 생산 절차에 대한 인터페이스를 제공한다. ex) RTFReader 문서 변환기 RTFReader는 문서를 읽어 토큰의 타입에 따라 자신이 가지고 있는 빌더를 통해 원하는 변환을 수행할 수 있다. RTFReader는 디렉터로서 빌더를 합성하고(has-a 관계, 상속 x..