디자인 패턴 이란 ?
디자인 패턴은 소프트웨어 설계 시 특정 상황에서 자주 만나는 문제를 해결하기 위해 시용할 수 있는 재사용 가능한 솔루션을 말한다 모든 패턴에는 간결한 이름이 있어서 잘 알려진 패턴을 적용하고자 할 때 간단히 패턴 이름을 언급하는 것만으로도 설계의 의도와 해결책을 함께 설명할 수 있다는 장점이 있다.
디자인 패턴은 주로 객체지향 설계에 관한 것이고, 대부분 객체 지항적 설계 원칙을 이용해 문제를 해결한다.
패턴의 설계 구조를 보면 대부분 비슷한데,그 이유는 객체지향적인 설계로부터 문제를 해결하기 위해 적용할 수 있는 확장성 추구 방법이 대부분 두 가지 구조로 정리되기 때문이다.
하나는 클래스 상속이고 다른 하나는 오브젝트 합성이 다. 따라서 패턴의 결과로 나온 코드나 설계 구조만 보면 대부분 비슷해 보인다. 패턴에서 가장 중요한 것은 각 패턴의 핵심이 담긴 목적 또는 의도다.
패턴을 적용할 상황,해결해야 할 문제, 솔루션의 구조와 각 요소의 역할과 함께 핵심 의도가 무엇인지를 기억해둬야 한다.
디자인 패턴은 객체지향 언어인 자바를 사용하는 개발자라면 반드시 공부해야 할 주제다.
그렇다면 자주 사용되는 패턴 2가지에 대해서 알아보자
#탬플릿 메소드 패턴
상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법이다. 변하지 않는 기능은 슈퍼클래스에 만들어두고 자주 변경 되며 확장할 기능은 서브클래스에서 만들도록 한다.
슈퍼 클래스에서는 미리 추상 메소드 또는 오버라이드 가능한 메소드를 정의해두고 이를 활용해 코드의 기본 알고리즘을 담고 있는 템플릿 메소드를 만든다. 슈퍼클래스에서 디폴트 기능을 정의해두거나 비워뒀다가 서브 클래스에서 선택적으로 오버라이드 할 수 있도록 만들어둔 메소드를 훅(hook) 메소드라고 한다. 서브 클래스에서는 추상 메소드를 구현 하거나 훅 메소드를 오버라이드 하는 방법을 이용해 기능의 일부를 확장!
#팩토리 메소드 패턴
팩토리 메소드 패턴도 템플릿 메소드 패턴과 마찬가지로 상속을 통해 기능을 확장하게 하는 패턴이다. 그래서 구조도 비슷하다.
슈퍼클래스 코드에서는 서브클래스에서 구현할 메소드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다. 메소드는 주로 인터페이스 타입으로 오브젝트를 리턴하므로 서브클래스에서 정확히 어떤 클래스의 오브젝트를 만들어 리턴할지는 슈퍼 클래스에서는 알지 못한다.
서브클래스는 다양한 방법으로 오브젝트를 생성하는 메소드를 재정의할 수 있다. 이렇게 서브클래스에서 오브젝트 생성 방법과 클래스를 결정할 수 있도록 미리 정의해둔 메소드를 팩토리 메소드라고 한고, 이방식을 통해 오브젝트 생성 방법을 나머지 로직, 즉 슈퍼클래스의 기본
코드에서 독립시키는 방법을 팩토리 메소드 패턴이라고 한다.
근데 이렇게 글로만 적어둔다면 팩토리 메소드 패턴은 잘 이해가 가지 않는다... 나 또한 와닿지 않는다.
대표적인 예로 "피자"가 존재한다
Pizza.java
public abstract class Pizza {
public abstract String getName();
}
TomatoPizza.java
public class TomatoPizza extends Pizza{
@Override
public String getName(){
return "TomatoPizza";
}
}
PepperoniPizza.java
public class PepperoniPizza extends Pizza{
@Override
public String getName(){
return "PepperoniPizza";
}
}
Factory.java
public abstract class Factory {
public abstract Pizza createPizza(String name);
}
PizzaFactory.java
public class PizzaFactory extends Factory{
@Override
public Pizza createPizza(String name) {
switch(name) {
case : "Tomato" :
return new TomatoPizza();
case : "Pepperoni" :
return new PepperoniPizza();
}
return null;
}
}
main.java
public class Main{
public static void main (String[] args){
PizzaFactory pizzaFactory = new PizzaFactory();
Pizza pizza1 = pizzaFactory.createPizza("Tomato");
Pizza pizza2 = pizzaFactory.createPizza("pepperoni");
System.out.println(pizza1.getName());
System.out.println(pizza2.getName());
}
}
결과 :
TomatoPizza
PepperoniPizza
이점은 무엇인가?
두둥탁~ 결합도!!!
팩토리 메소드 패턴은 직접 사용하는 객체를 생성하지 않고 팩토리 메서드 클래스를 통해 객체를 대신 생성시키고
그 객체를 반환 받아 사용하기 때문에 효율적인 코드 제어를 할 수 있을 뿐더러 결합도를 낮춰 유지보수가 용이하다
'Java' 카테고리의 다른 글
객체직렬화 ? (0) | 2020.02.23 |
---|---|
Network - TCP 통신 (0) | 2020.01.16 |
Thread를 이용한 실시간 시계 (0) | 2019.12.14 |
Comparable , Comparator (0) | 2019.12.14 |
달력 검색 (0) | 2019.12.14 |