본문 바로가기

Design Pattern18

구조 패턴 - 프록시(Proxy) - 참조: GoF의 디자인패턴 - 참조: https://refactoring.guru/design-patterns/proxy - 프록시 패턴 다른이름으로 대리자(Surrogate) 라고도 하며 다른 객체에 대한 접근을 제어하기 위한 역할을 한다. - 문제점 많은 시스템의 리소스를 소비하는 객체가 있다고 가정하자. 해당 객체가 특정 시점이 되면 사용되겠지만 언제나 필요한건 아니다. 이때 흔히 알고 있는 Lazy loading 기법을 사용할 수 있다. 정말 필요한 시점에만 해당 객체를 생성하고, 해당 객체의 모든 클라이언트는 초기화 코드를 수행하면 된다. 하지만 이런 방식으로 구현하면 코드의 중복이 너무 많이 나타난다. 이런 코드를 해당 객체에 직접 넣는 방법도 있지만 만약 해당 클래스가 3rd-party .. 2021. 5. 20.
구조 패턴 - 플라이급(Flyweight) - 참조: https://refactoring.guru/design-patterns/flyweight - 플라이급(Flyweight) GoF의 디자인 패턴에서는 공유를 통해 많은 수의 소립 객체들을 효과적으로 지원한다고 되어있다. 대략적으로 의미는 알것 같기도 한데 뭔가 확실하게 와닿지는 않는다. 개인적으로는 refactoring.guru의 설명이 더 명료하고 와닿는다고 생각한다. refactoring.guru 에서는 "플라이급 패턴은 각 객체에서 데이터를 다루는 대신 객체들의 공통되는 상태를 공유하여 RAM을 확보하는 디자인 패턴이다." 라고 정의하고 있다. - 시나리오 플레이어가 맵을 돌아다니면서 서로 쏘는 게임을 만든다고 가정하자. 많은 양의 총알, 미사일, 파편들이 온 맵에 흩뿌려질것이다. 이 게.. 2021. 5. 19.
구조 패턴 - 퍼사드(Facade) - 참조: GoF의 디자인 패턴 - 참조: https://refactoring.guru/design-patterns/facade - God object: https://en.wikipedia.org/wiki/God_object - 퍼사드(Facade) 패턴 퍼사드(Facade) 는 용어 부터 낯설게 느껴지는것 같아 사전적 정의부터 살펴보는게 좋겠다. Facade는 정면, 표면이라는 뜻으로 이를 알면 왜 패턴의 이름이 퍼사드인지 알 수 있다. 퍼사드 패턴은 라이브러리나 프레임워크 혹은 클래스들의 집합과 같은 서브시스템을 사용하기 쉽도록 하나의 간편한 인터페이스를 제공하는 패턴이다. - 시나리오 비디오 파일을 사용자가 요청한 format 으로 변경해주는 응용프로그램이 있다고 가정하자. 비디오 파일 포맷 변환.. 2021. 5. 12.
구조 패턴 - 장식자(Decorator) - 참조: GoF의 디자인 패턴 - 다른 패턴과의 관계: https://refactoring.guru/design-patterns/decorator - 장식자(Decorator) 아마 한번쯤은 들어봤을법한 랩퍼(Wrapper) 라고도 불리우는 패턴이다. 객체에 동적으로 새로운 책임을 추가할 수 있게 한다. 기능을 추가하려면 서브 클래스를 생성하는것보다 융통성 있는 방법을 제공한다. - 시나리오 GUI 툴킷이 있다고 가정해보자. 모든 사용자 UI 요소에는 필요 없지만, 어떤 특정 사용자 UI 요소에만 스크롤링이나 테두리 같은 속성을 추가할 필요가 있다고 해보자. Text 를 출력하는 서비스를 제공하는 TextView 클래스가 있다고 가정하자. 이 TextView에 스크롤 기능이나 두꺼운 테두리가 필요하다면.. 2021. 5. 11.
구조 패턴 - 가교(Bridge) - 참조: GoF의 디자인 패턴 - 가교(Bridge) 패턴 가교(Bridge) 패턴은 다른 이름으로 핸들/구현부(Handle/Body) 라고도 불리우며, 구현부에서 추상적인 부분을 을 분리하여 독립적으로 다양성을 가질 수 있도록 한다. - 시나리오 보통 하나의 추상적 개념에 대해 여러 가지 구현을 해야할 때, 대부분 상속을 통해 처리한다. 코드에서 추상적인 개념을 인터페이스로 정의하고, 클래스들이 이를 구현하게 처리하는 방식일것이다. 상속은 잘 사용하면 좋은 기법이 되지만 구현부가 추상적 개념에 강하게 종속된다. 추상적 개념과 구현을 분리해서 재사용이 불가능해지거나 확장하기가 쉽지 않다. 이식성이 있는 Window를 추상적 개념으로 보고 이를 UI 툴킷을 써서 구현하는 예를 생각해보자. 이 Window.. 2021. 5. 1.
객체 생성 패턴- 프로토타입 - 참조: GoF의 디자인 패턴 - 참조(refactoring.guru): https://refactoring.guru/design-patterns/prototype - 참조(refactoring.guru - java example): https://refactoring.guru/design-patterns/prototype/java/example - 프로토타입(Prototype) 패턴, 원형 패턴 원형이 되는 인스턴스를 사용하여 생성할 객체의 종류를 명시하고, 이렇게 만든 견본 인스턴스를 복사하여 새로운 객체를 생성한다. 또한 코드가 클래스에 의존하지 않고, 객체를 복사할 수 있다. 시나리오: 그래픽을 편집하는 프레임워크가 있다고 해보자. 이 프레임워크를 기반으로 음표, 쉼표, 보표(악보의 5줄)를 표.. 2021. 2. 25.
객체 생성 패턴- 팩토리 메소드 - 참조: GoF의 디자인 패턴 - Template method: https://en.wikipedia.org/wiki/Template_method_pattern - 팩토리 메소드 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내린다. 팩토리 메소드의 예제를 검색하면 흔히 메소드의 매개변수의 타입에 따라 반환하는 객체가 다른 예제가 많이 나온다. 그래서 흔히 객체를 매개변수타입에 따라 다르게 반환하는것이 팩토리 메소드라고 생각한다. 물론 나도 예전에는 그렇게 생각했다. 하지만 위의 정의를 다시한번 생각해보면 팩토리 메소드의 핵심은 매개변수에 따라 다른 인스턴스를 반환하는것이 아님을 알 수 있다. 이 패턴의 주요핵심은 어떤 인스턴스를 생성할지에 .. 2021. 2. 21.
객체 생성 패턴- 추상 팩토리 패턴 - 참조: GoF의 디자인 패턴 - 참조: https://www.baeldung.com/java-abstract-factory-pattern - 추상 팩토리 추상 팩토리는 상세화된 서브 클래스를 정의하지 않고, 관련성이 있거나 독립적인 여러 객체 군을 생성하기 위한 인터페이스를 제공한다. 문장이 어려워 이해하지 못했더라도 낙담할 필요는 없다. 다음에 나올 내용들을 살펴본 뒤 이 문장을 이해하면 된다. 모티프, 프리젠테이션 매니저와 같은 사용자 인터페이스 툴킷 프로그램은 서로 다른 룩앤필을 가지고 있다. 만약 이 툴킷을 이용하여 응용프로그램을 개발한다고 가정해보자. 프로젝트 초반에 모티프 툴킷을 이용하여 개발하자고 표준을 잡고 개발을 시작한다. 개발자들은 열심히 모티프 툴킷을 이용하여 개발을 완료하였다. .. 2021. 2. 15.