팩토리 패턴은 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴이자 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴입니다.
상위 클래스와 하위 클래스가 분리되어 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성 방식에 대해 모르기에 더 많은 유연성을 갖게 됩니다.
그리고 로직이 분리되어 리팩토링하더라도 한 곳만 고칠 수 있게 되어 유지 보수성이 증가됩니다.
예를 들어, 라떼 레시피, 아메리카노 레시피, 우유 레시피 등 구체적인 내용이 들어 있는 하위 클래스가 상위 클래스로 전달 되면
상위 클래스인 바리스타 공장에서는 이 레시피를 토대로 라떼, 아메리카노, 우유를 생산한다고 생각하면 됩니다.
abstract class Coffee{
public abstract int getPrice();
//toString은 Object 가지는 메소드이기 때문에 오버라이딩 할 수 있음
//오버라이딩을 함으로써 주소가 아니라 문자+가격이 출력
@Override
public String toString(){
return "Hi this coffee is "+ this.getPrice();
}
}
class CoffeeFactory{
public static Coffee getCoffee(String type, int price){ // 입력에 따른 생성을 이 CoffeeFactory에서 담당
if("Latte".equalsIgnoreCase(type)) return new Latte(price); //Enum, Map을 이용하여 if문을 쓰지 않고 매핑 가능
else if ("Americano".equalsIgnoreCase(type)) return new Americano(price);
else return new DefaultCoffee();
}
}
class DefaultCoffee extends Coffee {
private int price;
public DefaultCoffee(){
this.price = -1;
}
@Override
public int getPrice() {
return this.price;
}
}
class Latte extends Coffee{
private int price;
public Latte(int price){
this.price = price;
}
@Override
public int getPrice() {
return this.price;
}
}
class Americano extends Coffee {
private int price;
public Americano(int price){
this.price = price;
}
@Override
public int getPrice() {
return this.price;
}
}
public class main {
public static void main(String[] args) {
Coffee latte = CoffeeFactory.getCoffee("Latte", 4000);
Coffee ame = CoffeeFactory.getCoffee("Americano", 3000);
System.out.println("latte = " + latte); //latte = Hi this coffee is 4000
System.out.println("americano = " + ame); //americano = Hi this coffee is 3000
}
}
참고
[책] 면접을 위한 CS 전공지식 노트
'지식 > Computer Science' 카테고리의 다른 글
[디자인 패턴] 옵저버 패턴 (Observer Pattern) (0) | 2022.05.03 |
---|---|
[디자인 패턴] 전략 패턴 (Strategy Pattern), 정책 패턴 (Policy Pattern) (0) | 2022.05.03 |
[디자인 패턴] 싱글톤 패턴 (Singleton Pattern) (0) | 2022.05.02 |
[지식] 프로세스, 스레드 (process, thread) (0) | 2022.04.23 |
[지식] OSI 7 계층 (0) | 2022.04.21 |