반응형

데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한며, 서브 클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 재공한다.


데코레이터 패턴의 특징

데코레이터의 슈퍼클래스는 자신이 장식하고 있는 객체의 수퍼클래스와 같다.

한 객체를 여러 개의 데코레이터로 감쌀 수 있다.

데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 것 외에 원하는 추가적인 작업을 수행할 수 있다.

객체는 언제든지 감쌀 수 있기 때문에 실행중에 필요한 데코레이터를 마음대로 적용할 수 있다.


데코레이터 패턴 사용시 주의할 점

데코레이터 패턴을 사용하면 자잘한 객체들이 매우 만힝 추가될 수 있고, 데코레이터를 너무 많이 사용하면 코드가 필요 이상으로 복잡해질 수도 있다.


 이후에 나오는 팩토리빌더 디자인 패턴을 배울 때 이러한 객체를 만드는 더 나은 방법에 대해서 설명한다.


데코레이터 패턴 형태


OCP(Open-Closed Principle)

 OCP는 가장 중요한 디자인 원칙 가운데 하나이다. 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀있어야 한다. OPC는 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단히 추가할 수 있어 새로운 기능을 추가하는 데 있어서 유연해 지고 튼튼한 디자인을 만들 수 있다.


반응형
반응형

스트래티지 패턴은 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 이것을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.


디자인의 원칙

1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다. 바뀌는 부분을 따로 뽑아서 캡슐화 시키면, 나중에 바뀌지 않는 부분에는 영향을 미치지 않은 채로 그 부분만 고치거나 확장할 수 있다.

2.구현이 아닌 인터페이스에 맞춰서 프로그래밍을 한다. 클래스나 서브 클래스에서 구현을 하지않고 인터페이스를 사용하면 특정 구현에 의존하지 않고 자유롭게 변경할 수 있다.

3. 상속보다는 구성을 활용한다. 상속이 아닌 두 클래스를 합치는 구성을 이용하여 시스템의 유연성을 향상시키고 실행시에 행동을 바꿀 수도 있다.


스트래티지 패턴에 자세한 설명과 코드는 다음 링크에 잘나와 있어서 생략한다.

http://warmz.tistory.com/750

http://www.gurubee.net/pages/viewpage.action?pageId=1507368

참고 : Head First Design Pattern

반응형
반응형

싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다.


사용하는 이유

하나만 있으면 되는 스레드 풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정을 처리하는 객체, 로그 기록용 객체, 프린터나 그래픽 카드 같은 디바이스를 위한 디바이스 드라이버 등 객체를 쓸 때 인스턴스를 두 개 이상 만들게 되면 프로그램이 이상하게 돌아가거나, 자원을 불필요하게 잡아먹어 결과의 일관성이 없어지는 것같은 문제가 발생할 수 있다.


싱글턴 vs 전역 변수

싱글턴과 전역 변수는 어디서든지 엑세스할 수 있지만, 전역 변수는 플렛폼에 따라 다르지만 애플리케이션이 시작될 때 생성 되어 자원을 차지한다. 만약 끝날 때까지 사용하지 않는다면 자원을 차지하게 된다. 하지만 싱글턴 패턴을 사용하면 필요할 때만 객체를 만들게 된다.


고전적인 싱글턴 패턴

이 코드를 사용 할 경우 문제가 발생하기 때문에 다른 방법을 사용한다.

public class Singleton {

      // 유일한 인스턴스를 저장하기 위한 정적 변수

private static Singleton uniqueInstance;

// 생성자가 private로 선언을 했기 때문에 Singleton에서만 클래스의 

// 인스턴스를 만들 수 있다.

private Singleton() {}

// getInstance()에서 null일 경우에만 생성을 하고 있을 경우는 그대로 

// 반환하여 유일한 인스턴스가 만들어 진다.

publilc static Singleton getInstance() {

if(uniqueInstance == null) {

uniqueInstance = new Singleton();

}

return uniqueInstance;

}

}


고전적인 싱글턴 패턴의 문제점

고전적인 싱글턴 패턴에 문제는 여러개의 스레드를 사용하게 되면서 문제가 발생하였다. 1번 스레드와 2번 스레드에서 동시에 사용하게될 경우 동시에 진입이 되어 진행된다. 그 결과 2개의 인스턴스가 만들어 지게 된다.


멀티스레딩 문제 해결 방법

위 문제를 해결하기 위해서는 3가지 방법이 있다. 아래 내용은 JAVA에서 사용되는 방법이므로 다른 언어에서는 다른 방법으로 변환하여 사용해야 한다.

1. getInstance()의 속도가 중요하지 않을경우 synchronized를 사용

동기화를 시킬경우 끝나기를 기다려야 하기 때문에 성능이 저하된다.


2. 인스턴스를 필요할 때 생성하지 말고, 처음부터 만들어 버린다.


3. DCL(Double-Checking Locking)을 사용하여 getInstance()에서 동기화되는 부분을 줄인다.

DCL을 사용하면, 인스턴스가 생성되어 있는지 확인한 다음, 생성되어 있을 않았을 때만 동기화를 할 수 있다. 이렇게 하면 처음에만 동기화를 하고 나중에는 동기화를 하지 않아도 된다.


참고 : HeadFirst Design Patterns

반응형

+ Recent posts