본문 바로가기

디자인패턴15

[C#/Unity][디자인패턴] 방문자 패턴(Visitor Pattern) 1. 방문자 패턴이란? - 알고리즘을 객체 구조에서 분리시키는 패턴. - 데이터 구조와 데이터 처리를 분리하여, 데이터 구조 내부에 방문자 클래스를 만들어 각각을 처리한다. - 방문자와 방문 공간을 분리하여, 방문 공간이 방문자를 맞이하고, 이후에 대한 행동은 방문자에게 위임하는 패턴. 2. 방문자 패턴을 사용하는 경우 - 자료구조(데이터)와 자료구조를 처리하는 로직(알고리즘)을 분리해야 할 경우 - 데이터 구조보다 알고리즘이 더 자주 바뀌는 경우 - 복잡한 객제 구조(ex. 객체 트리)의 모든 요소에 대해 작업을 수행해야 하는 경우 3. 방문자 패턴의 장점 - 구조를 수정하지 않고, 새로운 동작을 기존의 객체 구조에 추가할 수 있다. - 작업 대상(방문 공간)과 작업 항목(방문 공간을 가지고 하는 일).. 2023. 12. 31.
[C#/Unity][디자인패턴] 책임 연쇄 패턴(Chain of Responsibility Pattern) 1. 책임 연쇄 패턴이란? - 사용자의 요청을 처리함에 있어, 연쇄(Chain)적으로 연결되어있는 처리 객체(Handler)들을 이용하는 패턴. - 클라이언트로부터의 요청을 처리할 수 있는 처리 객체를 집합(Chain)으로 만들어 부여함으로 결합을 느슨하게 하기 위해 만들어진 디자인 패턴. - 일반적으로 요청을 처리할 수 있는 객체를 찾을 때까지 집합 안에서 요청을 전달한다. - 각각의 인스턴스의 책임들이 체인처럼 연쇄되어 있다는 뜻이다. - 요청을 보내는 쪽과 처리하는 쪽을 분리시키고, 요청을 보내는 쪽에서 해당 요청을 처리하는 핸들러가 어떤 구체적인 타입인지에 상관없이 디커플링된 상태에서 요청을 처리할 수 있게끔 해주는 패턴. - 클라이언트의 요청에 대한 세세한 처리를 하나의 객체가 몽땅 하는 것이 .. 2023. 12. 29.
[C#/Unity][디자인패턴] 템플릿 메서드 패턴(Template Method Pattern) 1. 템플릿 메서드 패턴이란? - 기능의 뼈대(템플릿)와 실제 구현을 분리하는 패턴. - 알고리즘의 구조를 메서드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경헚이 알고리즘을 재정의하는 패턴. - 상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법. - 변하지 않는 기능을 슈퍼클래스에 만들어두고, 자주 변경되면 확장할 기능은 서브클래스에 만든다. 2. 템플릿 메서드 패턴을 사용하는 경우 - 알고리즘이 단계별로 나누어 지거나, 같은 역할을 하는 메서드이지만 여러곳에서 다른 형태로 사용이 필요한 경우 사용. - 알고리즘의 특정 단계들만 확장할 수 있도록 하고 싶지만 알고리즘의 구조는 확장하지 못하도록 하고 싶은 경우 3. 템플릿 메서드 패턴의 장점 - 중복을 줄이고, 코드의 재사용성을.. 2023. 12. 28.
[C#/Unity][디자인패턴] 전략 패턴(Strategy Pattern) 1. 전략 패턴이란? - 정책 패턴(Policy Pattern)이라고도 불리며 특정 알고리즘을 별도로 분리하여 설계하는 방법을 말함. - 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 사용할 수 있게 해줌. - 실행 중에 알고리즘(전략)을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴. - 객체의 행위를 변경하고 싶을 때, 직접 수정하지 않고 전략이라 불리는 캡슐화된 알고리즘을 변경. - 특정한 계열의 알고리즘들을 정의하고, 각 알고리즘을 캡슐화하며, 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하도록 만든다. - 객체들이 할 수 있는 각각의 행위에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여 객체의 행위를 동적으로 바꾸.. 2023. 12. 28.
[C#/Unity][디자인패턴] 메멘토 패턴(Memento Pattern) 1. 메멘토 패턴이란? - 객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 패턴. - 객체의 상태 정보를 저장하고 사용자의 필요에 의해 원하는 시점의 데이터를 복원할 수 있는 패턴. - 캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법. 2. 메멘토 패턴을 사용하는 경우 - 어떤 객체의 상태를 변경하고, 이 변경 내용을 이후에 취소하거나 이전 상태로 복원하려고 할 때 사용 - 객체의 field, getter, setter들을 직접 접근하는 것이 해당 객체의 캡슐화를 위반할 때 사용 3. 메멘토 패턴의 장점 - 객체의 모든 정보를 외부로 노출시키지 않고 캡슐화를 지킬 수 있다. - 캡슐화를 위반하지 않고 객체의 상태 스냅샷들을 생성할 수 있다. - 코드를 단순화 시킬 수 있다. 4. 메멘토 패.. 2023. 12. 21.
[C#/Unity][디자인패턴] 인터프리터 패턴(Interpreter Pattern) 1. 인터프리터 패턴이란? - 자주 등장하는 문법을 별개의 간단한 언어로 정의하고 재사용하는 패턴. - Expression이라는 추상 클래스를 만들어 사용하는 경우가 많음. - 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장할 수 있음. - 트리구조로 인해 컴포지트 패턴과 유사한 형태를 띈다. 2. 인터프리터 패턴을 사용하는 경우 - 특정 언어 또는 문법이 반복되서 사용되는 경우 3. 인터프리터 패턴의 장점 1) 캡슐화 : 문법과 해석을 기본 로직에서 분리하여 별도의 클래스로 캡슐화되므로 모듈화되어 유지보수가 쉬워진다. 2) 쉬운 확장 : Expression 클래스에서 파생된 새로운 구현 클래스만 추가하면 DSL을 쉽게 확장할 수 있다. 3) 가독성 : 문법과 규칙을 계층구조를 이용해 명시적으로 .. 2023. 12. 12.
[C#/Unity][디자인패턴] 프록시 패턴(Proxy Pattern) 1. 프록시 패턴이란? - 어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조 하는것이 아니라, 해당 객체를 대행(대리, proxy)하는 객체를 통해 대상 객체에 접근하는 방식을 사용하는 패턴. - 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고, 실제 객체의 기능이 반드시 필요한 시점까지 객체의 생성을 미룰 수 있다. - 원래 객체에 대한 접근을 제어할 수 있어, 요청이 들어와 원래 객체에 전달되기 전이나 후에 무언가를 수행할 수 있다. - 대리자로써 작업 수행을 요청하면 처리 후 그 결과를 알려주는 패턴. - 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴. - 상속받은 인터페이스의 클래스 내부에서 같은 인터페이스를 상속받은 인스턴스를 생성하는 패턴.. 2023. 12. 4.
[C#/Unity][디자인패턴] 경량 패턴(Flyweight Pattern) 1. 경량 패턴이란? - 재사용 가능한 객체 인스턴스를 공유시켜 메모리 사용량을 최소화하는 구조 패턴. - 한 개의 고유 상태를 다른 객체들에서 공유하게 만들어 메모리 사용량을 줄이는 패턴 - 내용이 같은 객체가 이미 있으면 새로 객체를 만들지 않고, 내용이 같은 기존 객체를 공유한다. - 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하며 사용하도록 메모리 사용량을 최소화하는 패턴. - 반복된 데이터에 대해 하드웨어의 부담을 줄여주는 패턴 2. 경량 패턴을 사용하는 경우 - 메모리를 최소한으로 사용해야하는 경우 - 공통적인 인스턴스를 많이 생성하는 로직이 포함된 경우 - 생성된 객체가 오래도록 메모리에 상주하며 사용되는 횟수가 많은 경우 - 어플리케이션에 의해 생성되는 객체의 수가 많아.. 2023. 12. 1.
[C#/Unity][디자인패턴] 데코레이터 패턴(Decorator Pattern) 1. 데코레이터 패턴이란? - Decorate의 의미 '꾸민다'의 뜻 그대로 어떤 객체를 꾸며주기 위해 필요한 여러 요소들을 추가해주는 패턴. - 객체에 추가 요소를 동적으로 더할 수 있는 디자인 패턴. - 개발 확장에 있어 base 클래스 밑에 서브 클래스를 만들어 확장시킬 때, 데코레이터 패턴을 사용하면 서브 클래스를 만들어 확장할 때보다 더 확장성 있게 구현할 수 있음. - 기본 기능에 추가할 수 있는 많은 종류의 부가 기능에서 파생되는 다양한 조합을 동적으로 구현할 수 있는 패턴. - 객체의 결합을 통해 기능을 동적으로 유연하게 확장할 수 있도록 해주는 패턴. - 각각이 개별적인 객체면서 parent에선 멤버인 child 객체를 사용할 수 있고, 관련 기능들을 위임하여 실행하는 패턴. - OCP .. 2023. 11. 29.
[C#/Unity][디자인패턴] 컴포지트 패턴(Composite Pattern) 1. 컴포지트 패턴이란? - 사용자가 단일 객체와 복합 객체 모두 동일하게 처리할 수 있음. - 객체들의 관계를 트리구조로 구성하여 부분-전체 계층을 표현하고 각 구조들을 개별 객체들처럼 다룰 수 있는 구조패턴. - 여러 객체의 합성(composite)을 제어할 수 있도록 하는 객체를 정의 - 동일한 타입의 자식 객체들을 관리하는 동일한 타입의 컴포지트 객체를 생성하여 관리하는 객체를 통해 자식 객체들에게 접근하는 패턴 - 복합 객체(Composite)와 단일 객체(Leaf)를 동일한 컴포넌트로 취급하여, 클라이언트에게 이 둘을 구분하지 않고 동일한 인터페이스를 사용하도록 하는 패턴. 2. 컴포지트 패턴을 사용하는 경우 - 전체-부분의 관계를 갖는 객체들 사이의 관계를 정의할 경우 - 여러 개체를 동일한.. 2023. 11. 28.
[C#/Unity][디자인패턴] 어댑터 패턴(Adapter Pattern) 1. 어댑터 패턴이란? - 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴. - 두 객체 사이의 래퍼 역할을 함. - 호환되지 않는 객체들이 협업할 수 있게 함. - 기존 코드를 클라이언트가 사용하는 인터페이스의 구현체로 바꿔주는 패턴. - 하나의 객체에 대한 호출을 캐치하고 두 번째 객체가 인식할 수 있는 형식과 인터페이스로 변환시켜줌. 2. 어댑터 패턴을 사용하는 경우 - 버그가 없이 이미 존재하는 클래스를 재사용하는 경우 - 이미 만들어진 클래스를 새로운 인터페이스에 맞게 개조시키는 경우 - 오픈소스를 사용하거나 프로젝트 중간에 합류해서 작업해야 하는 경우 3. 어댑터 패턴의 장점 1) 호환성 : 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있음.. 2023. 11. 23.
[C#/Unity][디자인패턴] 프로토타입 패턴(Prototype Pattern) 1. 프로토타입 패턴이란? - 어떤 객체에 대한 프로토타입을 만들어 놓고 그것을 복사해서 사용하는 패턴 - Clone을 이용하여 객체를 생성하는 방법 - 본래의 오브젝트의 복사본을 만들어 각 객체에 따라 데이터를 수정해주는 방식으로 오브젝트를 생성 - 기존에 생성된 객체를 이용하여 해당 타입의 객체를 생성 - 생성할 객체들의 타입이 프로토타입인 인스턴스로부터 결정, 인스턴스는 새 객체를 만들기 위해 자기 자신을 복제 - 유니티에서는 Instantiate()가 같은 역할을 하도록 구현되어 있음. - 객체들을 그의 특정 클래스들에 결합하지 않고 복제할 수 있도록 하는 생성 디자인 패턴 2. 프로토타입 패턴을 사용하는 경우 - 비슷한 오브젝트를 지속적으로 생성해야 할 경우 - 클래스로부터 인스턴스 생성이 어려.. 2023. 11. 17.