CS) 디자인 패턴 - 1
1. 디자인 패턴의 종류
객체 간의 관계로 설계시 발생한 문제점을 해결할 수 있도록 정해 놓은 것입니다. 대표적인 디자인 패턴으로 싱글톤 패턴, 팩토리 패턴 등이있습니다. 앞으로 공부를 하면서 간단하게 각각의 팩토리 패턴의 사용법과 장단점위주로 짧게 설명하겠습니다. 아래는 순서대로 설명할 디자인 패턴입니다.
- 싱글톤 패턴
- 팩토리 패턴
- 전략 패턴 ( 정책 패턴 )
- 옵저버 패턴
- 프록시 패턴 / 프록시 서버
- 이터레이터 패턴
- 노출모듈 패턴
- MVC 패턴
- MVP 패턴
- MVVM 패턴
1.1 싱글톤 패턴
싱글톤 패턴이란? 하나의 클래스에서 하나의 인스턴스만 가지는 패턴으로, 하나의 인스턴스를 공유하는 방식입니다. 이 패턴을 자바에서 선언 하는 방식은 아래와 같습니다.
class Singleton {
public final Pattern pattern;
public Singleton(){
pattern = new Pattern();
}
}
싱글톤 패턴의 장점과 단점은 아래와 같습니다.
- 장점
- 사용하기 쉽고 실용적이다.
- 인스턴스를 생성할 때 드는 비용을 줄일 수 있습니다.
- 단점
- TDD(Test Driven Development)를 할 때 문제가 생길 수 있습니다.
- 독립적인 인스턴스를 만들기가 어렵습니다.
- 인스턴스를 공유하기때문에 주의하여 사용해야합니다.
- 의존성이 높아집니다. ( 모듈간의 연결을 강하게 합니다. )
싱글톤 패턴은 데이터베이스 연결 모듈에 많이 사용합니다.
1.2 팩토리 패턴
팩토리 패턴이란? 객체를 사용하은 코드에서 객체생성부분을 떼어내 추상화한 패턴입니다. 이 패턴은 상위 클래스에서 뼈대를 결정하고 하위 클래스에서 객체를 생성하여 구체적인 내용을 결정하는 방식읍니다. 자바에서 팩토리 패턴을 구현하는 방법은 아래와 같습니다.
abstract class Coffee{
protected String menu;
}
class Latte extends Coffee{
public Latte(){
menu = "latte";
}
}
class Espresso extends Coffee{
public Espresso(){
menu = "Espresso";
}
}
팩토리 패턴의 장점과 단점은 아래와 같습니다.
- 장점
- 상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가잡니다. 더 많은 유연성을 가질 수 있습니다.
- 코드를 리펙터링하더라도 한 곳만 고칠 수 있게 되어 유지보수성이 증가합니다.
- 단점
- 각각의 새로운 객체 타입마다 새로운 팩토리 클래스가 필요할 수 있어 클래스가 불필요하게 많아질 수 있습니다.
- 인터페이스에 의존성이 높아져서 인터페이스 설계가 중요하게 됩니다.
1.3 전략 패턴 ( 정책 패턴 )
전략 패턴이란? 직접 수정하지 않고, 캡슐화한 알고리즘( 전략 )을 컨텍스트 안에서 바꿔주면서 교체가 가능하게 만드는 패턴입니다. 예시로 인터넷에서 결제를 할 때, 네이버 페이와 카카오 페이 등으로 결제할 수 있는 것이 있습니다. 자바에서 전략 패턴을 구현하는 방법은 아래와 같습니다.
interface Payment{
public void pay(int amount);
}
class Kcard implements Payment{
@Override
public void pay(int amount){
System.out.println(amount + "using Kcard");
}
}
class Ncard implements Payment{
@Override
public void pay(int amount){
System.out.println(amount + "using Ncard");
}
}
위와 같이 선언을 한 후 아래 코드에서 위 Kcard와 Ncard를 이용하는 방식으로 사용합니다.
class Purchase{
int[] amounts;
public int sumAmount(){
int sum = 0;
for(int amount : amounts){
sum += amount;
}
return sum;
}
public void pay(Payment payment){
int amount = sumAmount();
payment.pay(amount);
}
}
위와 같이 선언을 한다면 main에서 아래와 같이 이용할 수 있습니다. 간략하게만 적겠습니다.
Purchse purchse();
purchse.pay(new Kcard());
purches.pay(new Ncard());
이 코드는 같은 메서드로 서로 다른 객체를 이용하는 코드입니다.
전략 패턴의 장점과 단점은 아래와 같습니다.
- 장점
- 컨텍스트 코드의 변경 없이 새로운 전략을 추가할 수 있습니다.
- OCP의 원칙을 준수 할 수 있습니다.
- 단점
- 컨텍스트에 적용되는 알고리즘이 적은 경우, 요구사향의 변경될 여지가 없는 경우는 불필요합니다.
1.4 옵저버 패턴
옵저버 패턴이란? 주체가 객체의 상태 변화를 관찰하다 변화가 있을 때, 메서드 등을 통해 목록에 있는 옵저버 들에게 변화를 알려주는 디자인 패턴입니다. 이때 주체란 객체의 상태를 확인하는 역할을 하고, 옵저버란 메서드를 통해 들어온 변화를 통해 추가 변화 사항이 생가는 객체를 의미합니다. 아래는 자바에서 옵저버 패턴을 구현하는 방식입니다.
interface Subject{
public void register(Observer obj);
public Object getUpdate(Observer obj);
}
interface Observer{
public void update();
}
class Topic implements Subject{
private List<Observer> observers;
private String message;
public Topic(){
this.observers = new ArrayList<>();
this.message = "";
}
@Override
public void register(Observer obg){
if(!observers.contains(obj)){
observers.add(obj);
}
}
@Override
public Object getUpdate(Observer obj){
return this.message
}
}
class TopicSubscriber implements Observer{
private Subject topic;
public TopicSubscriber(Subject topic){
this.topic = topic;
}
@Override
public void update(){
String msg = (String) topic.getUpdate(this);
System.out.println(msg);
}
}
위와 같이 설계를 할 수 있습니다. 관찰자( Subject )는 여러 옵저버( Observer )를 가지고 있고, update를 통해 변화를 갱신할 수 있습니다.
옵저버 패턴의 장점과 단점은 아래와 같습니다.
- 장점
- Subject의 상태변화를 주기적으로 조회하지 않아도 됩니다.
- Subject와 Observer 객체 사이의 관계가 느슨하게 연결됩니다.
- 단점
- Observer의 응답 순서를 보장하지 않습니다.
- Observer를 명시적으로 관리하기때문에 메모리 누수가 발생할 수 있습니다.
옵저버 패턴을 활용한 대표적인 서비스는 트위터가 있습니다.