본문 바로가기

디자인 패턴

옵저버 패턴 (Observer Pattern) 옵저버 패턴 주체가 어떤 객체에 상태 변화가 있을 때마다 메소드 등을 통해 옵저버 목록에 있는 옵저버들에게 변화를 알려주는 디자인 패턴이다. 주체와 객체를 분리하지 않고 상태가 변경되는 객체를 기반으로 구현하기도 한다. 옵저버 패턴은 주로 이벤트 기반 시스템에 사용하며 MVC 패턴에서도 사용된다. MVC 패턴에서의 동작을 예로 들면 모델(주체)에서 변경 사항이 생겨 update() 메소드로 옵저버인 뷰에 알려주고 이를 기반으로 컨트롤러가 작동한다. 구현 형태 유저1과 유저2가 등록되어 두 유저에게 공지사항을 알려주고 유저1을 삭제하고 유저2에게 인사한다. 유저에 대한 상태 변화가 일어나면 notify 메소드를 통해 변화를 알려준다. 더보기
전략 패턴 (Strategy Pattern) 전략 패턴 객체의 행위를 바꾸고 싶은 경우 직접 수정하지 않고 캡슐화한 알고리즘을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다. 기본 틀 내에서 원하는 방식이 바뀔 경우 전략만 바꿔주는 것이다. 구현 형태 결제 방식에 대한 PaymentStrategy 인터페이스를 생성하고 KakaoCard와 LunaCard는 각각의 기본 구조를 가지고 있고 해당 인터페이스를 본인 클래스에서 구현한다. Item 클래스를 이용해 ShoppingCart 클래스에 담는 형식으로 구현한다. ShoppingCart.pay에서 PaymentStrategy를 매개변수로 사용하는데 카드들이 PaymentStrategy 인터페이스를 참조하기 때문에 LunaCard를 사용하면 paymentMethod가 LunaCard가.. 더보기
팩토리 패턴 (Factory Pattern) 팩토리 패턴 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이다. 상속 관계에 있는 두 클래스에서 상위 클래스가 뼈대를 결정하고 하위 클래스에서 객체 생성에 관한 세부 내용을 결정한다. 상위 클래스와 하위 클래스의 분리로 유연성이 증대되고 객체 생성 로직이 따로 있어 리팩토링하더라도 유지 보수성이 증가된다. 구현 형태 CoffeeFactory 상위 클래스에서는 뼈대를 만들고 Latte, Americano, DefaultCoffee 등 하위 클래스들은 세부 정보들을 가지고 있어 위의 코드에서는 세부 정보에 따라 알맞은 객체를 생성해준다. Latte, Americano, DefaultCoffee 클래스를 기반으로 객체를 생성하지 않고 CoffeeFactory를 통해 생성하게 되며 getCof.. 더보기
싱글톤 패턴 (Singleton Pattern) 싱글톤 패턴 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴으로 보통 데이터베이스 연결 모듈에 사용한다. 하나의 인스턴스를 다른 모듈들이 공유하며 사용해 생성 비용이 줄어들지만 의존성이 높아지는 단점이 있다. 단점 Test Driven Development를 할 때는 단위 테스트를 진행하고 테스트가 서로 독립적이어야 하는데 싱글톤 패턴에서는 테스트들이 독립적인 인스턴스를 가지기 힘들다. 또한 모듈 간 결합도가 강해져 의존성이 증가하는데 이 문제는 의존성 주입을 통해 모듈 간의 결합을 느슨하게 만들 수 있다. 메인 모듈이 직접적으로 의존성을 부여하지 않고 중간에 의존성 주입자를 거쳐 하위 모듈에 의존성을 부여함으로써 의존성을 보다 떨어뜨린다. 의존성 주입을 사용할 시 모듈을 쉽게 교체할 수 있는 구조가.. 더보기