일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
resize() 멤버 함수는 Shape 인터페이스와 관계가 없기 때문에 데커레이터에서 호출할 수 없다. 보통의 상속 대신 MixIn 상속이라 불리는 방식을 이용한다. static_assert를 이용해 Shape이외의 타입이 지정되는 것을 막는다. template struct ColoredShape : T{ static_assert(is_base_of::value, "template argument must be a Shape"); string color; string str() const override{ ostringstream oss; oss
데커레이터 패턴 : 어떤 기능에 추가적으로 기능을 덧붙이고 싶을 경우 그 기능들을 Decorator로 만들어서 덧붙이는 방식. 이미 존재하는 타입에 새로운 기능을 추가하면서도 원래 타입의 코드에 수정을 피할 수 있게 해준다. 시나리오 도형을 나타내는 Shape가 기존에 존재하고 있고 이를 상속받아 색상이 있는 도형과 투명한 도형을 추가한다. 나중에 두가지 속성을 모두 필요로 하는 경우가 발생하여 추가로 클래스를 만드는데 결과적으로 두가지 기능을 추가하기 위해 클래스를 3개 만들게 된다. 이런식이면 기능이 하나 추가될때마다 7개의 클래스를 만들어야 할 수도 있다. struct Shape{ virtual string str() const =0; }; struct Circle: Shape{ float radi..
개별 그래픽 객체를 렌더링할 수도 있고 여러 개의 도형을 하나의 그룹으로 렌더링할 수도 있다. 다음과 같은 인터페이스 하나면 충분하다. struct GraphicObject{ virtual void draw() = 0; }; 여러개의 사각형과 원들이 모인 그래픽 객체들도 집합적으로 하나의 그래픽 객체를 나타낼 수 있다. 원을 다음과 같이 정의할 수 있듯이 여기서 컴포지트 디자인 패턴이 드러난다. struct Circle : GraphicObject{ void draw() override{ std::cout
컴포지트 패턴 : 어떤 객체들의 집합에 대해 개별 인터페이스를 동일하게 가져갈 수 있게 하는 것 크리쳐 클래스를 정의한다. class Creature { int strength, agility, intelligence; public: int get_strength() const{ return strength; } void set_strength(int strength){ Creature::strength = strength; } // 다른 get/set 멤버 함수들... }; 통계를 내려면 단순하게 다음과 같이 만들어야 한다. 하지만 바람직하지 않다. class Creature{ // 다른 멤버들... int sum() const { return strength + agility + intelligenc..
Pimpl 관례는 브릿지 패턴의 특별한 예이다. Renderer 클래스는 벡터, 래스터로 그릴 수 있다고 한다. Renderer 베이스 클래스는 다음과 같이 정의한다. struct Renderer{ virtual void render_circle(float x, float y, float radius) = 0; }; 실제로 그리지 않고 콘솔에 메세지를 출력한다. struct VectorRenderer : Renderer{ void render_circle(float x, float y, float radius) override{ cout
# 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 클래..