일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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/Modern C++ 디자인패턴 (19)
GGym's Practice Notes
이전 코드는 문제가 되는 상황이 있다. 화면이 업데이트 될때마다 DrawPoints()가 불리는 경우를 생각한다. 전혀 바뀐 것이 없더라도 도형의 선분들이 어댑터에 의해 반복적으로 점으로 변환된다. 비효율적인 중복 작업을 피하기 위해 캐싱을 이용한다. 모든 어플리케이션이 기동할 때 미리 어댑터를 이용해 정의해 두고 재활용하는 것이다. vector points; for(auto& o : vectorObjects){ for(auto& l : *o){ LineToPointAdapter lpo{l}; for(auto& p : lpo){ points.push_back(p); } } }
# 시나리오 기본적인 그리기 객체를 정의하자. 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는 모두 같아진다. 모노스테이트의 장단점 장점 - 상속받기 쉬워 다형성을 활용할 수 있다. - 생존 주기가 적절히 잘 정의된다. - 시스템에서 사용 중인 이미 존재하는 객체를 수정하여 이용할 수 있다. 단점 - 코드 깊숙이 손을 댄다. (일반 객체를 모노스테이트로 변..
# 전역객체로서의 싱글턴 손쉽게 개발자간의 약속을 하여 주석 등으로 단 한번만 인스턴스 하도록 하는 것이다. struct Database{ /** * \brief 이 객체를 두 개 이상 인스턴스화 하지 마시오. */ Database(){} }; 하지만 의도하지 않은 은밀한 방식으로 생성자가 호출되어 버릴 수도 있다. 가장 간단한 아이디어는 static 전역 객체를 두는것이다. static Database database{}; static 전역객체의 문제점은 각각의 컴파일 단위 바이너리들에서 초기화 순서가 정의되어 있지 않다는 것이다. 전역객체가 여러 개 사용된다면 어느 한 모듈에서 전역 객체를 참조할 때 그 전역 객체가 참조하는 또 다른 전역 객체가 아직 초기화된 상태가 아닐 수 있다. 그리고 사용자가 ..
자주 복제해서 사용할 기본 객체들이 미리 정해져있다면 프로토타입 팩터리를 사용하는 것이 좋을 수 있다. 전역변수를 선언하여 복제해 사용해도 좋겠지만 프로토타입을 저장한 별도의 클래스를 두고 사용자가 원할 때, 목적에 맞는 복제본을 요구받는 시점에 만들어 제공하는 것이다. struct EmployeeFactory{ static Contact main; static Contact aux; static unique_ptr NewMainOfficeEmployee(string name, int suite){ return NewEmployee(name, suite, main); } static unique_ptr NewAuxOfficeEmployee(string name, int suite){ return NewE..
책에서는 직렬화도 소개한다. (모던CPP디자인패턴/https://book.naver.com/bookdb/book_detail.nhn?bid=14742427) 직렬화는 어떠한 객체 데이터를 비트의 나열로 만들어 파일로 저장하거나 네트워크로 전송할 수 있게 하는것을 말한다. 직렬화를 사용하면 객체복제를 쉽게 할 수 있게 만든다. 객체를 비트열로 나타내고 역직렬화를 통해 모든 정보와 내부 구성요소들을 복구 할 수 있다. 이 작업은 복제작업과 동일하다. C++은 아쉽게도 직렬화를 표준으로 지원하지 않는다. Boost 라이브러리를 사용하여 지원하지만 나는 라이브러리나 코드생성기의 도움 없이 코드를 구현하고 싶다... 전체 코드 : #include #include #include #include #include u..