빌더 패턴은 객체지향 프로그램에서 다양한 오브젝트생성문제에 유연한 솔루션을 제공하는 디자인패턴이다.
빌더 디자인 패턴의 의도는 복잡한 객체의 구성을 구현과 분리하는 것이다.

어떻게 복잡한 객체의 표현들을 하나의 객체로 만들 것인가?
어떻게 복잡한 객체의 생성이 포함된 클래스를 단순화할 것인가?

복잡한 객체의 부분들을 만들고 조립하는 것을 클래스 내부에 직접적으로 넣는것은 유연하지 않다.
그것은 클래스에게 복잡한 객체의 특정한 표현을 만들도록 하며, 나중에 클래스와 독립적으로 표현을 변경할 수 없도록 한다.

빌더 디자인패턴은 어떻게 그러한 문제를 해결하는지 묘사한다.

복잡한 객체의 생성과 조립은 독립적인 빌더 오브젝트에 캡슐화함
클래스는 객체생성을 직접 하지않고, 빌더 객체에게 위임한다.

추상 팩토리는 공통점을 가지고 있는 개별적인 팩토리들의 그룹을 캡슐화시키는 방법을 제공한다.

 

 

UML class diagram - wiki

 

사용

 

추상팩토리 디자인 패턴은 다음과 같은 문제들을 해결하는데 사용할 수 있다.

 

체가 생성되는 방식과의 응용프로그램의 독립성을 어떻게 구현을 할 것인가?

클래스가 필요한 객체가 생성되는 방식과, 클래스의 독립성을 어떻게 구현 할 것인가?

관련되거나 의존관계가 있는 그룹을 어떻게 생성할 것인가?

 

예시

 

조금 더 구체적인 예시를 들자면 서로 다른 OS의 UI를 구현하는 상황을 들 수 있다.

 

윈도우와 Mac은 각각의 브라우저에 고유한 버튼과 체크박스 UI를 가지고 있다.

하지만 윈도우나 Mac 모두 브라우저가 실행될때 버튼과 체크박스를 렌더링 해야 한다.

이런 경우에 리눅스용 브라우저가 추가되고 리눅스용 체크박스와 버튼의 UI를 추가해야 하는 상황을 생각해보자.

어떻게 해야 기존 코드들의 변경을 최소화하고 리눅스용 브라우저 추가 이후에도 확장이 쉽도록 구현할 수 있을까?

 

브라우저가 체크박스와 버튼을 렌더링 하는 기능은 공통부분이며, 체크박스와 버튼의 UI를 구현하는 것은 각각 독립적으로 구현해야 하는 부분이다.

 

이런 경우에 OS에 상관없이 브라우저가 체크박스와 버튼을 구현하는 팩토리 인터페이스를 하나 만들고, OS별로 해당 인터페이스를 구현하여 각 OS에 맞는 UI를 구현할 수 있게 된다.

또한 체크박스와 UI도 인터페이스를 생성하고, 각각의 OS에 해당하는 구체적인 서브클래스들을 만들게 되면, 브라우저에서 체크박스와 버튼을 사용할 때 공통 타입으로 사용할 수 있게 된다.

 

The cross-platform UI classes example.

 

https://refactoring.guru/design-patterns/abstract-factory

https://en.wikipedia.org/wiki/Abstract_factory_pattern

행동 패턴 (Behavioral pattern)이란?

 

소프트웨어 공학에서, 행동패턴이란, 객체 간의 일반적인 커뮤니케이션 패턴을 식별하는 디자인 패턴이다.

그렇게 함으로써, 행동패턴은 커뮤니케이션 수행의 유연성을 높인다.

 

 

Interpreter Design Pattern

https://sourcemaking.com/design_patterns/interpreter

 

행동 패턴의 예시

  • 책임 연쇄 (Chain of responsibility)
    연쇄적으로 연결된 객체들간의 요청을 전달하는 방법이다.
  • 커맨드 (Command)
    명령요청을 객체로 캡슐화하는 방법이다.
  • 인터프리터 (Interpreter)
    프로그램에 언어요소를 포함하는 방법이다.
  • 반복자 (Iterator)
    콜렉션의 요소에 순차적으로 접근하는 방법이다.
  • 중재자 (Mediator)
    클래스간의 단순화된 커뮤니케이션을 정의하는 방법이다.
  • 메멘토 (Memento)
    객체의 내부상태를 캡쳐하고 복원하는 방법이다.
  • 널 객체 (Null Object)
    객체의 기본값으로 작동하도록 디자인하는 방법이다.
  • 옵서버 (Observer)
    여러 클래스들의 변경사항을 알리는 방법이다.
  • 상태 (State)
    객체의 상태가 변화했을때, 객체의 동작을 변경하는 방법이다.
  • 전략 (Strategy)
    클래스 내부의 알고리즘을 캡슐화하는 방법이다.
  • 템플릿 메소드 (Template method)
    알고리즘의 구체적인 단계를 하위클래스에 연기하는 방법이다.
  • 비지터 (Visitor)
    클래스를 변경하지 않고 새로운 작업을 정의하는 방법이다.

 

 

https://en.wikipedia.org/wiki/Behavioral_pattern

 

Software design pattern - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Reusable solution to a commonly occurring software problem In software engineering, a software design pattern is a general, reusable solution to a commonly occurring problem within a g

en.wikipedia.org

 

 

구조패턴(Structural pattern) 이란?

 

소프트웨어 공학에서, 구조 패턴은 객체사이의 관계를 구현할 때 간단한 방법을 식별하여 디자인을 용이하게 하는 패턴이다.

 

 

Decorator Design Pattern

이미지 출처:

https://sourcemaking.com/design_patterns/decorator

 

Design Patterns and Refactoring

Design Patterns and Refactoring articles and guides. Design Patterns video tutorials for newbies. Simple descriptions and full source code examples in Java, C++, C#, PHP and Delphi.

sourcemaking.com

 

 

구조패턴의 예시

 

  • 어댑터 (Adapter pattern): 한 클래스의 하나의 인터페이스를 클라이언트가 기대하는 형식으로 변형시키는 패턴이다.
    • 어댑터 파이프라인: 여러개의 어뎁터를 디버깅목적으로 사용한다.
    • 개조 인터페이스 패턴(Retrofit Interface Pattern): 동시에 여러개의 클래스를 위한 하나의 새로운 인터페이스로 사용되는 어뎁터
  • 집계 (Aggregate pattern): 자식들의 집합을 위한 합성패턴의 버전과 메서드들
  • 브릿지 (Bridge pattern): 구현으로부터 추상화를 분리하여 그 두가지가 독립적으로 다를 수 있도록 하는 패턴
  • 합성 (Composite pattern): 모든 객체들이 같은 인터페이스를 가지고있는 객체들의 트리 구조 패턴
  • 데코레이터 (Decorator pattern): 서브클래싱으로 인해 새 클래스가 기하급수적으로 증가할 때, 실행환경에 추가적인 기능을 객체에 추가하는 패턴
  • 익스텐서빌러티 (Extensibility pattern): 프레임워크 - 간단한 인터페이스 뒤에 복잡한 코드를 숨기는 패턴
  • 퍼사드 (Facade pattern): 일반적인 작업을 쉽게 사용할 수 있도록 기존 인터페이스의 단순화된 인터페이스를 생성하는 패턴
  • 플라이웨이트 (Flyweight pattern): 많은 수의 객체들이 공간절약을 위해 일반적인 속성 객체를 공유하는 패턴
  • 마커 (Marker pattern): 메타데이터를 클래스와 연결하기 위한 빈 인터페이스
  • 파이프와 필터 (Pipes and filters): 각 프로세스의 출력이 다음 프로세스의 입력이 되는 일련의 프로세스
  • 오파크 (Opaque pointer): 구현 세부 사항을 숨기기 위해 선언되지 않은 또는 private 타입에 대한 포인터
  • 프록시 (Proxy pattern): 다른 것에 대한 인터페이스 역할을 하는 클래스

 

https://en.wikipedia.org/wiki/Structural_pattern

 

 

생성패턴
소프트웨어 공학에서 생성패턴은 상황에 맞는 방식으로 객체를 생성하는 매커니즘을 다룬다.
객체생성의 기본형태는 디자인 문제나 디자인의 복잡도를 증가시키는 결과를 초래할 수 있다.
생성패턴은 객체생성을 컨트롤함으로써 그런 문제들을 풀어낸다.

생성패턴은 두가지의 주요 아이디어로 구성되어 있다.
하나는 시스템이 사용하는 구체적인 클래스에 관한 지식을 캡슐화 하는 것이다.
다른 하나는 이러한 구체적인 클래스의 인스턴스들이 생성되고 결합되는지를 숨기는 것이다.

생성패턴을 더 분류하면 객체생성패턴과 클래스생성패턴으로 분류할 수 있으며, 
객체생성패턴은 객체생성의 일부를 다른 객체에게 연기(postphone)하는 것인 반면에
클래스생성 패턴은 객체생성을 하위클래스에게 연기(postphone)하는 것이다.

 


생성패턴에서 가장 잘 알려진 5가지 패턴은 다음과 같다.

추상 팩토리 (Abstract factory)
추상 팩토리 패턴은 객체의 구체적인 클래스를 지정하지 않고서도 관련된 객체를 생성하기 위한 인터페이스를 제공한다.


빌더 (Builder)
빌더 패턴은 복잡한 오브젝트들의 구성을 표현과 분리시켜서 같은 구성절차가 다른 표현을 만들 수 있게 한다.

팩토리 메서드 (Factory method)
팩토리메서드 패턴은 클래스에게 인스턴스 생성을 하위클래스로 연기할 수있게 해준다.

지연된 초기화 Lazy initialization


프로토타입 (Prototype)
프로토타입 패턴은 특정종류의 객체에게 프로토타입 인스턴스를 만들 수있게 지정해주며, 새로운 객체를 그 프로토타입을 복사하여 만들 수있게 한다.

싱글톤 (Singelton)
싱글톤패턴은 클래스가 오직 한개의 인스턴스만을 가지는것을 보장하며, 이것에 접근할 수있는 글로벌포인트를 제공한다.

의존성 주입 Dependency Injection
멀티턴 Multiton 
객체 풀 Object pool
Resource acquisition is initialization(관용구)

정의
생성패턴들은 시스템으로부터 어떻게 객체들이 생성되고, 구성되고, 나타나는지를 분리하는것을 목표로 한다.
어떻게, 언제, 누가, 어떤 객체를 생성하느냐 라는 측면에서 생성패턴들은 시스템의 유연성을 증가시킨다.

 

https://en.wikipedia.org/wiki/Creational_pattern

디자인패턴(Design Patterns)

소프트웨어 공학에서 디자인패턴은 소프트웨어 디자인에서 발생하는 문제에 대해 일반적으로 재사용가능한 솔루션을 말한다.
디자인패턴은 그대로 코드에 변환하여 사용할 수 있는 완성된 디자인은 아니지만,
수많은 각기 다른 상황들에서 문제를 어떻게 풀 것인가를 말해주는 기술(description) 혹은 탬플릿이다.

디자인 패턴의 활용

디자인패턴은 개발과정에서 테스트되고 입증된 개발 패러다임을 제공하여 개발속도를 향상시킨다.
효과적인 소프트웨어 디자인은 구현 후반부에도 보이지 않을수 있는 이슈들도 고려해야 한다.
디자인패턴의 재사용은 큰 문제를 야기할 수있는 파악하기 힘든 이슈들을 예방하는데 도움을 주며
이미 디자인패턴에 친숙한 개발자들에게 코드가독성을 향상시켜준다.

디자인패턴의 분류

디자인패턴은 크게 3가지로 분류된다.

생성 패턴 (Creational patterns)

2021.07.03 - [분류 전체보기] - [Design Pattern] 생성패턴(Creational pattern)

생성 패턴은 클래스생성에 관한 분류그룹이다.

구조 패턴(Structual patterns)
구조 패턴은 클래스와 객체들의 구조에 대한 분류그룹이다.

행위 패턴(Behavioural patterns)
행위 패턴은 객체들의 커뮤니케이션에 관한 분류그룹이다.

 

wikipedia : software design pattern

https://en.wikipedia.org/wiki/Software_design_pattern

+ Recent posts