디자인 패턴이란 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 잇도록 하나의 '규약' 형태로 만들어 놓은 것을 의미합니다.
하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴이다. 보통 데이터베이스 연결 오듈에 많이 사용한다.
인스턴스를 생성할 때 드는 비용이 줄어드는 장점이 잇지만 의존성이 높아진다는 단점도 있다.
싱글톤 패턴은 TDD(Test Driven Development)를 할 때 걸림돌이 된다.
단위 테스트는 테스트가 서로 독립적이어야 하며 테스트를 어떤 순서로든 실행할 수 있어야한다. 하지만 싱글톤 패턴은 '독립적인' 인스턴스를 만들기가 어렵다.
싱글톤 패턴은 모듈간의 결합을 강하게 만들 수 있다는 단점이있다. 의존성 주입을 통해 모듈 간의 결합을 느슨하게 만들어 해결할 수 있다.
위 그림과 같이 메인 모듈이 직접 다른 하위 모듈에 대한 의존성을 주는 것이 아닌 중간에 의존성 주입자가 이 부분을 가로채 메인모듈이 간접적으로 의존성을 주입하는 방식이다. 이를 통해 메인 모듈은 하위 모듈에 대한 의존성이 떨어지게 되고, 이를 '디커플링 된다'라고 표현하기도 한다.
의존성 주입의 장점
모듈들을 쉽게 교체할 수 잇는 구조가 되어 테스팅하기 쉽고 마이그레이션하기도 수월하다. 구현할 때 추상화 레이러를 넣고 이를 기반으로 구현체를 넣어 주기 때문에 어플리케이션 의존성 방향이 일관되고, 애플리케이션을 쉽게 추론할 수 있다.
의존성 주입의 단점
모듈들이 분리되므로 클래스 수가 늘어나 복잡성이 증가될 수 있으며 약간의 런타임 패널티가 생기기도 합니다.
의존성 주입 원칙
객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴이다.
객체의 행위를 바꾸고 싶은 겨우
직접
수정하지 않고 전략이라고 부르는캡슐화한 알고리즘
을 컨텐스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.
주체가 어떤 객체(subject)의 상태 변화를 관찰하다가 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다.
주체: 객체의 상태 변화를 보고 있는관찰자.
옵저버: 이 객체의 상태 변화에 따라 전달되는 메서드 등을 기반으로추가 변화 사항
이 생기는 개체들
프록시(proxy) 객체
어떤 대상의 기본적인 동작(속성 접근, 할당, 순회, 열거, 함수 호출 등)의 작업을 가로챌 수 있는 객체를 뜻한다.
프록시 패턴
대상 객체(subject)에 접근하기 전 그 접근에 대한 흐름을 가로채 대상 객체 앞단의 인터페이스 열할을 하는 디자인 패턴이다.
프록시 서버
서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램
이터레이터를 사용해 컬렉션의 요소들에 접근하는 디자인 패턴이다. 이를 통해 순회할 수 있는 여러 가지 자료형의 구조와는 상관없이 이터레이터라는 하나의 인터페이스로 순회가 가능하다.