본문 바로가기

디자인패턴

(8)
[디자인 패턴] 심플 팩토리, 팩토리 메소드, 추상 팩토리 정의 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다. 즉 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것. 결론 객체 생성 하는 코드를 분리하여 클라이언트 코드와 결합도(의존성)를 낮추어 코드를 건드리는 횟수를 최소화 하기 위한 패턴이다. 결합도는 왜 낮아지는가? 그것은 객체지향 성질중에 하나인 다형성을 이용 하였기 때문이다. 인터페이스를 구현한 객체들은 같은 인터페이스를 바라 보기 때문에 코드에 유연함이 있기 때문이다. 왜 코드를 건드리는 횟수가 최소화 될까? 객체를 생성하는 코드 부분을 분리 시켰기 때문에 객체를 추가/수정이 일어 나더라도 객체를 생성하는 코드만 건들면 되기 때문이다. 일단, 객체를..
[디자인 패턴] 싱글톤 패턴(Singleton Pattern) 정의 특정 클래스의 인스턴스가 하나만 만들어지고, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴 singleton private 멤버변수 선언 생성자를 private로 선언하여 외부에 노출이 되지 않도록 함 이후에 Static으로 전역에서 접근이 가능한 메소드(getInstance)를 생성해서 인스턴스를 반환 => 멤버변수에 이미 변수가 생성이 되어 있다면 해당 인스턴스를 리턴하며, 만약 인스턴스가 한번도 초기화 되지 않았다면, 생성한 후 리턴 예시) 프린터를 사용하는 사람이 여러명이라고 치자. 프린터를 사용하는 사람이 많다고 해서 프린터를 여러대를 구매하여 사용하는것은 매우 불필요한 낭비를 발생. => 해결책 프린터를 하나만 구매하여 공유하는 방법 프린터 관리자 public class Prin..
[디자인 패턴] 옵져버 패턴(Observer Pattern) 정의 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 정보가 자동으로 갱신되는 방식으로, 일대다(one-to-many) 의존성을 정의한다. 옵저버 패턴에서 주제자는 옵저버에 대한 정보가 없습니다. 오직 옵저버가 특정 인터페이스(Interface)를 구현한다는 것 만 알고 있습니다. 즉, 옵저버가 무슨 동작을 하는지 모른다는 것입니다. 게다가 옵저버는 언제든지 새로 추가되거나 제거될 수 있으며 새로운 형식의 옵저버를 추가할 때에도 주제에 전혀 영향을 주지 않습니다. 이러한 관계를 느슨한 결합(Loose coupling)이라고 합니다. 어떻게 이런 특징이 있을까요? 위의 UML을 확인해 보겠습니다. Subject interface는 등록, 해제, 갱신을 위한 API를 제공합니다. 그리고 이를 상..
[디자인패턴] 어댑터 패턴(Adaptor Parttern) 정의 어댑터 패턴은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다. 우리나라와 다른 콘센트나 전압(220V)을 쓰는 외국에 가면 그 나라의 콘센트와 전압(110V)을 사용할 수 있게 해주는 어댑터를 볼 수 있다. 어댑터란 형식이 다른 둘 사이에 연결되서 이 둘이 호환될 수 있도록 해주는 도구이다. 객체지향에서 어댑터는 보통 인터페이스가 다른 서로 다른 객체들이 같은 형식 아래 자동할 수 있도록 하는 역할을 한다. 예시) 양식 자격증을 가진 요리사는 '요리'를 하고 파티셰 자격증을 가진 파티셰는 '제과'를 한다 많은 요리사들이 일하는 식당에서 디저트 메뉴를 제공하기 위해 파티셰를 고용했다...
[디자인패턴] 데코레이터 패턴(Decorator Pattern) 정의 객체에 동적으로 새로운 책임을 추가할 수 있게 합니다. 기능을 추가하려면, 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다. 특정 클래스의 객체들이 할 수 있는 일을 여러가지 두고 각 객체마다 사용자가 원하는대로 골라 시키거나 기능들을 필요에 따라 장착할 수 있도록 할 때 사용된다. 예시) 비행기 게임에서 전투기가 아이템을 먹을 때마다 기본공격 + 새로운 공격 => 아이템을 먹을때마다 공격이 더 화려해짐. 커피는 기본 에스프레소에서 재료를 더할 때마다 새로운 종류의 커피가 된다. 에스프레소 + 물 => 아메리카노 에스프레소 + 물 + 얼음 => 아이스 아메리카노 에스프레소 + 우유 => 라떼 에스프레소 + 우유 + 얼음 => 아이스 라떼 대충 이런식ㅎㅎ; 코드로 확인해보자! Componen..
[디자인패턴] 퍼사드 패턴(Facade Pattern) 정의 Facade는 "건물의 정면"을 의미하는 단어로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미합니다. 퍼사드 객체는 복잡한 소프트웨어 바깥쪽의 코드가 라이브러리의 안쪽 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 사용 할 수 있게 간단한 인터페이스를 제공해줍니다. 예시) 여러 클래스의 객체들을 복합적으로 사용해야 수행할 수 있는 작업들이 있다. 이러한 복잡한 작업들이 여러곳에서 이루어질 때, 복잡한 수행과정을 하나의 클래스의 메소드로 만들어 구현한다. 사용자로 하여금 복잡한 연관 관계를 알 필요가 없도록 구현부를 프랑스어로 '외벽' 을 뜻하는 Facade 뒤에 숨겨둔다. 즉, 복잡하고 반복되는 코드를 하나의 메소드로 만들어 재사용!..
[디자인패턴] 템플릿메소드(Template Method Pattern) 정의 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의 하는 패턴이다. 알고리즘이 단계별로 나누어 지거나, 같은 역할을 하는 메소드이지만 여러곳에서 다른형태로 사용이 필요한 경우 유용한 패턴이다. abstractClass : 부모 클래스에는 전반 과정을 수행하는 메인 메소드가 있다. 세부 메소드를 추상메소드로 갖는다. concreteClass : 자식클래스는 부모의 추상메소드를 상속받아 오버라이딩 구현한다. 예시) 전통약과를 만드는 과정은 3개의 과정을 순차적으로 진행하여야 한다. 1. 반죽을 만드는 과정 2. 반죽을 기름에 튀겨내는 과정 3. 시럽을 바르는 즙청 과정 이 세개의 과정을 어떻게 하느냐에 따라 다양한 약과를 만들 수 있다. => 부모 메소드가 ..
[디자인패턴] 전략 패턴(Strategy Pattern) 정의 같은 문제를 해결하는 여러 알고리즘이 클래스별로 캡슐화되어 있고 이들이 필요할 때 교체할 수 있도록 함으로써 동일한 문제를 다른 알고리즘으로 해결할 수 있게 하는 디자인 패턴 예시) 게임 캐릭터가 착용한 무기에 따라 공격의 행위가 달라진다. 칼, 활, 창, 맨손 등 공격을 하는 행위는 동일하나 필요에 따라 무기를 바꾸어 공격할 수 있다. Strategy: 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시 => 장착무기 ConcreateStrategy1, 2, 3: 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스 => 칼, 활, 창, 맨손 Context: 스트래티지 패턴을 이용하는 역할 수행. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 sette..