Chapter 1. 서론

Composition vs aggregation vs delegation

  • Composition
    • 두 연관관계의 객체가 서로 별도로 존재할 수 없다.
    • House 가 만들어질때 Table 도 같이 만들어 져야함.
  • aggregation
    • 여러개의 집합관계의 느낌, 단독으로 존재도 가능하고 모아주는 느낌
  • delegation
    • 하나의 객체의 역할을 다른 객체에게 위임하고, 위임받은 객체는 독립적이여야 하며 런타임에 어떤객체가 될지 모른다.
  • 참고:

Chapter 3. 생성패턴

Sigleton Pattern

  • 오직 한개만 제공하는 클래스
public class Foo {
	private static Foo instance; 

	private Foo() {}

	public static Foo getInstance() {
		if (instance != null) {
			return new Foo();
		}

		return instance;
	}
}
  • multi thread 환경에서 Trhead safe 하지 않다.!
    • sychronized keyword 사용하기 -> 성능의 손해가 있다.
    • 이른 초기화: static block 에서 미리 만들어 준다.
    • double checked locking: 변수 선언시 volatile keyword 필요
private static volatile Foo instance;

public static Foo getInstance() {
	if (instance != null) {
		synchroized (Foo.class) {
			return new Foo();
		}
	}

	return instance;
} 
* static inner class 사용하기
public class Foo {
	private static Foo instance; 

	private Foo() {}

	private static class FooHolder {
		private static final Foo INSTANCE = new Foo();
	}

	public static Foo getInstance() {
		return FooHolder.INSTANCE;
	}
}

추상 팩토리 패턴 (Abstract Factory Pattern)

  • Abstract Factory, AbstractProduct 두개로 추상화된 인터페이스를 의존하게 된다. 중요한 포인트는 생성되는 객체의 집합을 하나의 팩토리에서 정의를 하는게 중요하다.
    • 집한군을 생성하는게 아니라면 Factory Method Pattern 을 이용하는게 좋을듯 하다.
    • 단점은, 만들어야할 제품군이 추가되는 요구사항에 유연하지 못하다. -> 동적타입언어를 이용한다면 이부분도 유연하게 구현은 가능할듯
  • 싱글턴패턴관련

Prototype Pattern

  • 복제 기능을 갖추고 있는 기존 인스턴스를 프로토타입으로 사용해 새 인스턴스를 만들 수 있다.

  • Java 에서 Clone
    • Clonable interface 를 구현하면 된다.
    • Java 에서 제공해주는 것은 기본적으로 얕은 복사
  • 장점
    • 복잡하게 객체를 만드는 과정을 숨길 수 있다.
    • 비용이 효율적일 수 있다.
    • 추상적인 타입을 리턴할 수 있다.
  • 단점
    • 구현 과정이 복잡해질 수 있다. 순환 참조가 있는경우