프로그래밍 199

템플릿 메소드 패턴 I

* 알고리즘 캡슐화 public abstract class CaffeineBeverage{ final void prepareRecipe(){ // 템플릿내에서 알고리즘의 각 단계는 메소드로 표현된다. boilWater(); brew(); pourInCup(); adCondiments(); } abstract void brew(); // 서브클래스에서 처리되는 메소드도 있고 abstract void addCondiments(); void boilWater(){ // 어떤 메소드는 이 클래스 내에서 처리되기도 한다... System.out.println("물 끓이는 중"); } void pourInCup(){ System.out.println("컵에 따르는 중"); } } public class Tea ex..

퍼사드 패턴

퍼사드 패턴의 정의 : 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있다. 퍼사드 패턴은 디자인 원칙의 최소지식원칙 을 준수한 패턴으로 볼수 있다. 퍼사드는 클라이언트를 복잡한 서브시스템과 분리시켜주는 역할을 한다. 퍼사드 패턴에서는 서브시스템을 가지고 퍼사드를 만들고, 실제 작업은 서브클래스에 맡긴다.

어댑터 패턴

public interface Duck(){ public void quack(); public void fly(); } public class MallardDuck implements Duck{ public void quack(){ System.out.println("Quack"); } public void fly(){ System.out.println("I'm flying"); } } public interface Turkey{ public void gobble(); //칠면조는 꽥꽥거리지 않습니다. 골골거리는 소리를 내죠. public void fly(); } public class WildTurkey implements Turkey{ public void gobble(){ System.out.pri..

싱글톤 패턴 II

싱글톤 패턴의 정의 - 싱글톤 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴입니다. * 고전적인 싱글톤 패턴 구현법 public class Singleton{ private static SingleTon uniqueInstance; private Singleton() {} public static Singleton getInstance(){ if(uniqueInstance == null){ unuqueInstance = new Singleton(); } return uniqueInstance; } } 위 코드는 얼핏보기에 싱글톤 패턴을 정확히(안전히) 구현한 것 같지만 멀티 스레드 환경에서 실행하였을 때 문제점이 발생합니다. getInsta..

싱글톤 패턴 - 리틀 싱글톤(Little Lisper스타일의 문답)

리틀 싱글톤 객체를 어떻게 생성 합니까 ? - new MyObject(); 다른 객체에서 MyObject를 만들고 싶어한다면 어떻게 해야 하죠? MyObject에 대해서 new 연산자를 다시 쓸 수 있나요? - 물론 가능하죠. 클래스만 있으면 언제든지 인스턴스를 만들 수 있는 거죠? - 예, public 으로 선언된 거라면 별 문제 없습니다. 만약 public 으로 선언되지 않았으면요? - 만약 public 클래스로 선언하지 않은 클래스라면 같은 패키지 안에 있는 클래스에서만 인스턴스를 만들 수 있습니다.하지만 같은 패키지에 속한 클래스에서는 여전히 인스턴스를 두 개 이상 만들 수 있죠. 흠.. 흥미롭군요.. 이렇게 할수있는건 혹시 아나요 ? public MyClass{ private MyClass() ..

커맨드 패턴 II

Invoker loading ... ① 클라이언트에서 커맨드 객체 생성 ② setCommand()를 호출하여 인보커에 커맨드 객체를 저장 ③ 나중에 클라이언트에서 인보커한테 그 명령을 실행시켜 달라는 요청을 함 public interface Command{ public void execute(); } // 주문서에 해당하는 인터페이스. (백지 상태의 주문서) public class PizzCookCommand implements Command{ // 주문서 인터페이스를 구현한 클래스 // 주문서에는 주문할 메뉴와, 어느 주방장이 요리 할 지에 대한 정보가 있다. Cooker cooker; // 리시버 클래스(주방장) public PizzCookCommand (Cooker cooker){ //생성자에 요리..

커맨드 패턴 I

** 호출 캡슐화 ** 한차원 높은 단계의 캡슐화 - 메소드 호출을 캡슐화한다. 메소드 호출을 캡슐화하면 계산 과정의 각 부분들을 결정화시킬 수 있기 때문에, 계산하는 코드를 호출한 객체에서는 어떤 식으로 일을 처리해야 하는지에 대해 전혀 신경 쓰지 않아도 된다. 그냥 결정화된 메소드를 호출해서 필요한 일만 잘 할 수 있으면 된다. 그 외에도 캡슐화된 메소드 호출을 로그 기록용으로 자장을 한다거나 취소 기능을 구현하기 위해 재사용하는 것과 같이 신기한 작업을 할 수도 있다. 커맨드 패턴과 유사한 형태의 실생활 패턴 고급 식당 운영 패턴 1. 고객이 웨이트리스한테 주문을 한다. 2. 주문서에 주문한 메뉴가 적힌다. 3. 웨이트리스는 주문서를 받아서 카운터에 갖다 주고는 "주문 받아요!" 라고 얘기 한다. ..

원칙을 지키는 데 도움이 될만한 가이드라인...

다음과 같은 가이드라인을 따르면 의존성 뒤집기 원칙에 위배되는 객체지향 디자인을 피하는 데 도움이 된다. 1. 어떤 변수에도 구상 클래스에 대한 레퍼런스를 저장하지 말자. - new 연산자를 사용하면 구상 클래스에 대한 레퍼런스를 사용하게 되는 것이다. 팩토리를 써서 구상 클래스에 대한 레퍼런스를 변수에 저장하는 일을 미리 방지하자. 2. 구상 클래스에서 유도된 클래스를 만들지 말자 - 구상 클래스에서 유도된 클래스를 만들면 특정 구상 클래스에 의존하게 된다. 인터페이스나 추상 클래스처럼 추상화 된 것으로부터 클래스를 만들어야 한다. 3. 베이스 클래스에 이미 구현되어 있던 메소드를 오버라이드 하지 말자 - 이미 구현되어 있는 메소드를 오버라이드한다는 것은 애초부터 베이스 클래스가 제대로 추상화 된 것이..

팩토리 - 팩토리 메소드 패턴

팩토리 패턴(사실 간단한 팩토리는 디자인 패턴이라고 할수 없다) 모든 팩토리 패턴에서는 객체 생성을 캡슐화한다. 장점 : 객체를 인스턴스화하는 작업을 한 클래스에 캡슐화시켜 놓으면 구현을 변경해야 하는 경우에 여기저기 다 들어가서 고칠 필요 없이 팩토리 클래스 하나만 고치면 된다 팩토리 메소드 패턴의 정의 : 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스(추상메소드)를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이다. 객체를 인스턴스화하는 일을 하는 메소드(팩토리 클래스로 캡슐화 된 메소드)를 생성된 객체를 사용할 클래스에 추상메소드로 만든다. 물론 해당 클래스는 추상클래..

데코레이터 패턴

클래스의 소스변경없이 추가기능을 동적으로 추가시키는 패턴. 데코레이터 패턴을 적용한 사례는 java.io 패키지에 많이 있다. Reader reader = new BufferedReader(new InputStreamReader(System.in)); ==> 풀어보면... Reader reader = new InputStreamReader(System.in); reader = new BufferedReader(reader); 정의 - 객체에 추가 요소를 동적으로 더할 수 있습니다. 데코레이터를 사용하면 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공합니다.