본문 바로가기

Java

[Java] 어댑터 패턴, 프록시 패턴, 데코레이터 패턴, 싱글턴 패턴

 

어댑터 패턴(Adapter Pattern)

 

  • 호출 당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴
  • JDBC가 어댑터 패턴을 이용해 다양한 데이터베이스 시스템을 단일한 인터페이스로 조작할 수 있게 해줌

 

Service A, B

 

Service A,B를 위한 변환기 
어댑터 패턴을 사용하는 클라이언트

  • 클라이언트가 변환기를 통해 service()라는 동일한 메서드명으로 두 객체의 메서드를 호출

 

프록시 패턴(Proxy Pattern)

 

  • 제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴
  • 개방 폐쇄 원칙과 의존 역전 법칙이 적용된 설계 패턴

 

인터페이스와 인터페이스 구현

 

인터페이스를 구현한 프록시와 프록시를 사용하는 클라이언트

  • 대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
  • 대리자는 실제 서비스에 대한 참조 변수를 갖는다.(합성)
  • 대리자는 실제 서비스의 같은 이름을 가진 메서드를  호출하고 그 값을 클라이언트에게 돌려준다.
  • 대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.

 

데코레이터 패턴(Decorator Pattern)

 

  • 메서드 호출의 반환값에 변화를 주기 위해 중간에 장식자를 두는 패턴
  • 데코레이터 패턴은 프록시 패턴과 구현 방법이 같다.
  • 프록시 패턴은 클라이언트가 최종적으로 돌려 받는 반환값을 조작하기 않고 그대로 전달하는 반면 데코레이터 패턴은 클라이언트가 받는 반환값에 장식을 더한다.

데코레이터

  • 리턴 값에 "정말"이라는 데코를 더해 클라이언트에게 돌려준다. 나머지는 프록시 패턴과 동일

 

싱글턴 패턴(Singleton Pattern)

 

  • 클래스의 인스턴스, 즉 객체를 하나만 만들어 사용하는 패턴
  • 커넥션 풀, 스레드 풀, 디바이스 설정 객체 등 인스턴스를 여러 개 만들게 되면 불필요한 자원으로 사용됨
  • 싱글턴 패턴은 오직 인스턴스 하나만 만들고 그것을 계속 재사용한다.

  • 싱글턴 패턴을 적용할 경우 의미상 두 개의 객체가 존재할 수 없다.
  • 객체 생성을 위한 new에 제약을 걸어야하고, 만들어진 단일 객체를 반환할 수 있는 메서드가 필요하다.
  • new를 실행할 수없도록 생성자에 private 접근 제어자를 지정한다.
  • 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요하다.
  • 유일한 단일 객체를 참조할 정적 참조 변수가 필요하다.

  • 4개의 참조변수(singletonObject, s1, s2, s3)가 하나의 단일 객체를 참조하고 있다.
  • 단일 객체인 경우 공유 객체로 사용되기 때문에 속성을 갖지 않게 하는 것이 정석이다.
  • 전역/공유 변수를 가능한 한 사용하지 말아야 한다.

싱글턴 패턴의 특징

  • private 생성자를 갖는다.
  • 단일 객체 참조 변수를  정적 속성으로 갖는다.
  • 단일 객체 참조 변수가 참조하는 단일 객체를 반환하는 getInstance() 정적 메서드를 갖는다.
  • 단일 객체는 쓰기 가능한 속성을 갖지 않는것이 정적이다.

 

참고 자료

  • 스프링 입문을 위한 자바 객체 지향의 원리와 이해, 위키북스, 김종민(지은이)