본문 바로가기

아는 만큼 보인다/Design Pattern

Singleton pattern 원소가 하나인 enum 자료형이 가장 좋은 singleton 구현방법이다. 왜? 리플렉션의 prive 생성자 접근을 통한 공격(추가 객체 생성)에 안전하다. Serializable 구현시 deserialize 될 때 마다 새로운 객체가 생성되는 일이 없다. (이를 방지하기 위해 readResolve 메소드를 추가할 필요 없다.) 코드가 간단한다. 코드 public enum MySingleton { INSTANCE; publc someMothods() { ... } } 출처 : Effective Java 2판, 규칙3. Singleton pattern 더보기
Builder Pattern 사용 예 생성자 또는 정적 펙토리 메소드의 인자가 많고, 인자들 중 선택항목이 많은 경우, Builder 패턴의 적용을 생각해 볼 수 있음 NutritionFacts nutrition = new NutritionFacts.Builder(9) .setB(8) .setC(7) .build(); 코드 public class NutritionFacts { private int necessaryA; // immutable object private int optionalB; private int optionalC; // builder inner class public static class Builder { private int a = 0; // 기본값 초기화 private int b = 0; private in.. 더보기
Service Provider Framework Pattern * 구성 Compenent 1) Service Interface : Service 사용자에게 제공하기 위해 표준?으로 정한 API가 정의된 Interface 2) Service Registration API : Provider Interface의 구현체를 등록하는 API 3) Service Access API : Service Interface의 구현체를 얻어오는 API (정적 팩토리 메소드) 4) Provider Interface : Service Interface의 하위 객체를 생성해주는 API가 정의된 Interface * Service Provider Framework Pattern 구현 간단예 (JDBC가 해당됨) // 1) Service Interface public interface Serv.. 더보기
데코레이터 패턴과 프록시 패턴 데코레이터 패턴과 프록시 패턴은 둘 모두가 프록시 오브젝트를 사용한다. 프록시 오브젝트란? 타깃/실체와 같은 인터페이스를 구현한 클래스를 말한다. 전략패턴에서는 같은 인터페이스를 구현한 클래스들은 여러가지 구체적인 기술들을 각각 구현한 클래스들로서 클라이언트에게 여러 기술에 대해 선택의 폭을 확장해 주기 위해서 였다. 그러나 프록시 오브젝트는 전략패턴에서 처럼 또 다른 기술을 구현한 오브젝트가 아니고, 타킷/실체라는 하나의 기술을 사용하면서 그 실체에 부가기능을 더하거나 또는 그 실체로의 접근 방법을 제어하기 위해 구현된다. 결국, 프록시 오브젝트는 타깃/실체의 메소드를 사용한다. 이를 실체에게 위임한다 라고 말한다. 1. 프록시 오브젝트가 부가기능을 더한 것이라면, 데코레이터 패턴이라 부른다. 실례를 .. 더보기
템플릿/콜백 패턴 (익명 내부 클래스를 주입하는 전략패턴) 템플릿/콜백 패턴은 전략패턴이다. client가 특정 인터페이스를 구현한 클래스를 생성하여 변하지 않는 클래스에 주입시에.. 익명 내부 클래스를 생성/주입하는 조금 특별한 경우라면.. (스프링에서) 이를 그냥 전략패턴이라고 부르기 보다는 조금 구분짓기 위해 템플릿/콜백 패턴이라 부른다. 템플릿/콜백 패턴에는 몇 가지 특징이 있다. 1. 인터페이스는 단 하나의 메소드를 선언하고 있다. (익명클래스 생성시에 override해서 구현할 메소드는 단 하나다) 2. 익명클래스내의 구현메소드가 client(외부 클래스)의 final 변수를 참조할 수 있다. 사용예) public class TestClient { .... @Test public void testSum() { int sum = calculator.su.. 더보기
전략 패턴 (using Interface) "어떤 클래스가 여러 구현클래스를 갖는 어떤 Interface를 사용한다." 변하지 않는 클래스가..변하는 부분에 대한 메소드를 선언만하고 있는 인터페이스를 사용하고해당 인터페이스에 대입될 구현 클래스는 그때 그때 상황/전략에 따라 결정된다. (생성) (사용) [Client] -----------> [Context/Template/변하지 않는 부분] ------------> [Interface] | | | ----------------- | (생성/ Context에 주입) | | ---------------------------------------> [Implement/변하는부분] [Implement] 더보기
템플릿 메소드 패턴 (abstract, extends) "추상메소드를 활용한 상속관계를 갖는다." 변경이 없을 부분은 부모 클래스가 구현하고..변하는 부분은 부모클래스가 abstract 메소드로 선언하고,자식 클래스가 그 abstract 메소드를 구현한다. 더보기