일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 컴포지트 빌더
- 싱글톤
- 빌더 패턴
- 흐름식 빌더
- 디자인패턴
- 그루비 스타일 빌더
- 프로토타입 중복처리
- 팩터리
- 팩터리 패턴
- 컴포지트
- 브릿지
- 프로토타입 패턴
- 동적 데코레이터
- 싱글턴 패턴
- 컴포지트 패턴
- 브릿지 패턴
- 팩터리 메서드
- 단순한 빌더
- 싱글톤 패턴
- 빌더
- 내부 팩터리
- 싱글턴
- 프로토타입
- 데커레이터
- 동적 데커레이터
- 디자인 패턴
- 추상 팩터리
- 데커레이터 패턴
- 함수형 팩터리
- 모던C++디자인패턴
- Today
- Total
목록Design Pattern (26)
GGym's Practice Notes
# Pimpl 관례 Pimpl (Pointer to Implementation) : 구현부를 포인터로 참조하는 관례 아래와 같이 Person의 클래스를 정의한다. struct Person{ string name; void greet(); Person(); ~Person(); class PersonImpl; PersonImpl *impl; }; PersonImpl은 무엇인가? 클래스의 구현부를 다른 클래스(PersonImpl)에 숨기고자 하는 의도에서 발생한다. 구현 클래스 PersonImpl을 헤더파일이 아닌 .cpp 파일에 정의하는 것이 핵심적이다. PersonImpl의 정의는 아래와 같다. struct Person::PersonImpl{ void greet(Person* p); }; Person 클래..
이전 코드는 문제가 되는 상황이 있다. 화면이 업데이트 될때마다 DrawPoints()가 불리는 경우를 생각한다. 전혀 바뀐 것이 없더라도 도형의 선분들이 어댑터에 의해 반복적으로 점으로 변환된다. 비효율적인 중복 작업을 피하기 위해 캐싱을 이용한다. 모든 어플리케이션이 기동할 때 미리 어댑터를 이용해 정의해 두고 재활용하는 것이다. vector points; for(auto& o : vectorObjects){ for(auto& l : *o){ LineToPointAdapter lpo{l}; for(auto& p : lpo){ points.push_back(p); } } }
최대한 책의 예제코드를 따라 써봤는데 콘솔 환경에서 실행 가능한 정도로는 작성하지 못했다. 대충 코드를 수정하면 실행 가능하게 할 수 있지만 콘솔환경에서 띄우는 것은 내 맘에 안들기도 해서 개시를 안했었다. 나중에 OpenGL과 glut를 사용해서 키보드 콜백으로 명령패턴을 적용했을때 잘 작동 하였는데, 계속 개선을 해보고 다른 게시글에 다시 OpenGL/GLUT를 적용한 코드를 올려야겠다. #include using namespace std; #define BUTTON_LEFT 37 #define BUTTON_UP 38 #define BUTTON_RIGHT 39 #define BUTTON_DOWN 40 // temp key define #define BUTTON_X 65 #define BUTTON_Y ..
한개의 인스턴스만 갖는 싱글턴 패턴을 적용시켜 파일시스템을 구축해보는 예제를 보고 적용해보았다. 예제코드를 제대로 돌아가게 만들기 위해 간단히 손보았다. (private으로 되어있는 생성자 때문에 friend 클래스를 쓴다든지...) 결과적으론 잘 작동한다. 한개의 인스턴스만 생성이 되며 플랫폼에 맞는 자식 클래스가 생성이 된다. #include using namespace std; //#define SWITCH #define PLAYSTATION4 class FileSystem{ public: static FileSystem& instance(); virtual ~FileSystem(){} virtual char* readFile(char* path)=0; virtual void writeFile(ch..
# 시나리오 기본적인 그리기 객체를 정의하자. struct Point{ int x, y; }; struct Line{ Point start, end; }; 기하학적 도형을 모두 담을 수 있도록 일반화 한다. vector을 상속받아 표현할 수도 있지만 순수 가상 함수의 쌍으로 정의하자. struct VectorObject{ virtual vector::iterator begin() = 0; virtual vector::iterator end() = 0; }; 이제 사각형 Rectangle을 시작점과 크기를 입력받아 생성하고, 사각형을 구성하는 선분들을 vector 타입 필드에 저장하여 그 꼭짓점들만 노출하는 방식으로 정의할 수 있다. struct VectorRectangle : VectorObject{ V..
모노스테이트는 싱글턴의 변형이다. 겉보기엔 일반 클래스 같지만 싱글턴처럼 동작한다. class Printer{ static int id; public: int get_id() const{ return id;} void set_id(int value) { id = value;} }; static 데이터를 이용하여 get/set 멤버함수가 구현되어 있다. 문제는 사용자가 일반 클래스로 알고 인스턴스를 만들어 다른 ID를 부여하지만 두 객체의 ID는 모두 같아진다. 모노스테이트의 장단점 장점 - 상속받기 쉬워 다형성을 활용할 수 있다. - 생존 주기가 적절히 잘 정의된다. - 시스템에서 사용 중인 이미 존재하는 객체를 수정하여 이용할 수 있다. 단점 - 코드 깊숙이 손을 댄다. (일반 객체를 모노스테이트로 변..