소프트웨어 디자인에서 계속 재현되는 문제를 해결하는 재사용 가능한 해결법이다.
ex> 문제 '특정 클래스가 실행간에 단 한번만 인스턴스화 되어 객체로 이용가능 하여야한다.'를 해결하기 위해 '싱글톤 디자인패턴'을 이용해 볼 수있다'
또는 특정 클래스의 생성 또는 객체화에 있어 호출당시의 콘텍스트(Context)를 고려하여 클래스를 반환해주는 “팩토리 디자인패턴(Factory Design Pattern)” 을 사용할 수 있다.
이렇게 디자인 패턴은 디자인(설계)간에 발생하는 문제를 해결해주는 해법 이라고 볼 수 있다. 디자인패턴은 데이터구조, 알고리즘과 다르며 아주 특정한 구조에서 특정한 문제에 한하여 한번만 문제를 해결 할 수 있는 디자인은 "디자인 패턴"이라고 보기 어렵다.(재사용이 가능해야 한다.)
조금 더 쉽게 말해 디자인 패턴(Design Pattern)은 문제/의도/해결방법이 명시적입니다. 즉 해당 패턴이 사용되는 문제가 “정형화” 되어 있으며, 해당 문제를 접근하는데 어떠한 의도를 가지고 어떻게 해결하는지에 대해서 명시적인 해결 방법 또는 접근 방법을 제안한다.
Singleton 패턴
Singleton패턴
이란? 애플리케이션에서 인스턴스를 하나만 만들어 사용하기 위한 패턴이다. 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등의 경우, 인스턴스를 여러 개 만들게 되면 자원을 낭비하게 되거나 버그를 발생시킬 수 있으므로 오직 하나만 생성하고 그 인스턴스를 사용하도록 하는 것이 이 패턴의 목적이다
오직 한개의 인스턴스만을 갖도록 보장
인스턴스가 여러개 면 제대로 작동하지 않는 상황이 종종 있다. 외부 시스템과 상호작용 하면서 전역 상태를 관리하는 클래스 같은 것이 그렇다 ex> 파일 시스템 API
파일 시스템 클래스로 들어온 호출이 이전 작업 전체에 대해서 접근할 수 있어야한다. 아무데서나 파일 시스템 클래스 인스턴스를 만들 수 있다면 다른 인스턴스에서 어떤 작업을 진행중인지를 알 수 없다. 이를 싱글턴으로 만들면 클래스가 인스턴스 하나만 가지도록 컴파일 단계에서 강제할 수 있다.
전역적인 접근점을 제공
로깅,콘텐츠 로딩, 게임저장 등 여러 내부 시스템에서 파일 시스템 래퍼클래스를 사용할 것이다. 싱글턴 패턴은 하나 인스턴스만 생성하는 것에 더해서 , 그 인스턴스를 전역에서 접근할 수 있는 메서드를 제공한다.
구현
C++의 디자인 패턴_경량패턴
하나의 클래스당 필요한 데이터가 너무 많고 크기도 클때, 1프레인에 GPU로 모두 전달하기에는 양이 너무 많다.
class Tree {private:Mesh mesh; // 메시 Texture bark; // 나무껍질 텍스처 Texture leaves; // 잎사귀 텍스처 Vector position;double height;double thickness;Color barTint;Color leafTint;};
이것을해결하기위해 -> 객체에 들어있는 데이터 대부분이 인스턴스별로 다르지 않다면? 그 객체를 반으로 쪼개어 명시적으로 모델링 할 수 있다.
모든 클래스가 다 같이 사용하는 데이터를 뽑아내 새로운 클래스를 만들 수 있다.
class TreeModel {private:Mesh mesh;Texture bark;Texture leaves;};
그럼 이 TreeModel 객체는 하나만 존재하게 된다. 그 이후 각 인스턴스들은 공유객체인 TreeModel을 참조하기만 하면된다.
class Tree { private: TreeModel * model;Vector position; double height; double thickness; Color barkTint; Color leafTint; }
GPU로 보내는 데이터 양을 최소화하기 위해서는 공유 데이터인 TreeModel을 딱 한 번만 보낼 수 있어야 한다. 그 후 각각 인스턴스마다의 데이터를 전달하고 마지막으로 GPU에 '전체 인스턴스를 그릴 공유데이터를 사용해' 라고 말하면 된다.
경량패턴
이름에서 알 수 있듯이 경량 패턴은 어떤 객체의 개수가 너무 많아서 좀 더 가볍게 만들고 싶을 때 사용 한다. 인스턴스 렌더링에서는 메모리 크기보다 렌더링할 나무 데이터를 하나씩 GPU 버스로 보내는 데 걸리는 시간이 중요하지만, 기본 개념은 경량 패턴과 같다.
경량 패턴은 객체 데이터를 두 종류로 나눈다. 먼저 모든 객체의 데이터 값이 같아서 공유할 수 있는 데이터를 모은다. 이런 데이터를 GoF는 고유 상태 또는 자유 문맥 상태라고 부른다. 예제에서는 나무 형태나 텍스처가 이에 해당한다. 나머지 데이터는 인스턴스별로 값이 다른 외부 상태에 해당한다. 예제에서는 나무의 위치, 크기, 색 등이 이에 해당한다.
'CS > ★what you must know★' 카테고리의 다른 글
sessionStorage / LocalStorage (0) | 2019.06.28 |
---|---|
Apache vs Tomcat (0) | 2019.03.27 |
Map/HashMap/TreeMap/Hashtable 차이점 (0) | 2018.11.19 |