[CS]디자인 패턴 : 팩토리 패턴

김피자·2023년 1월 27일
0

CS

목록 보기
3/22

1.1.2 팩토리 패턴(Factory Pattern)

: 객체를 사용하는 코드에서 객체 생성 부분을 떼어내 추상화한 패턴
: 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정하고, 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴

  • 상위 클래스와 하위 클래스가 분리되기 때문에 느슨한 결합을 가짐
  • 상위 클래스는 인스턴스 생성 방식에 대해 전혀 알 필요가 없어 더 많은 유연성을 가짐
  • 객체 생성 로직이 따로 떼어져 있어 코드를 리팩토링 하더라도 한 곳만 고칠 수 있게 유지 보수성 증가

예를 들어 라떼 레시피아 아메리카노 레시피, 우유 레시피라는 구체적인 내용이 들어있는 하위 클래스가 컨베이어 벨트를 통해 전달되고 상위 클래스인 바리스타 공장에서 이 레시피를 토대로 라떼 커피 우유 등을 생산한다고 생각하면 된다.

자바에서의 팩토리 패턴

abstract class Coffee{
	public abstract int getPrice();
    
    @Override
	public String toString(){
    	return "Hi this coffee is " + this.getPrice();
    }
}

class CoffeeFactory{
	public static Coffee getCoffee(String type, int price){
    	if("Latte".equalsIgnoreCase(type)) return new Latte(price);
        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(int price){
	this.price = price;
    
	@Override
	public int getPrice(){
    	return this.price;
    }
}

public class HelloWorld{
	public static void main(Stringp[] args){
    	Coffee latte = CoffeeFactory.getCoffee("Latte", 4000);
        Coffee ame = CoffeeFactory.getCoffee("Americano", 3000);
        System.out.println("Factory latte :: " + latte);
        System.out.println("Factory ame :: " + ame);
    }
}

/*
Factory latte :: Hi this coffee is 4000
Factory ame :: Hi this coffee is 3000
*/

if("Latte".equalsIgnoreCase(type))을 통해 문자열 비교를 기반으로 로직이 구성되어 있는데, IF문을 안쓰고 Enum이나 Map을 이용해도 된다

Enum
상수의 집합을 정의할 때 사용되는 타입
상수나 메서드 등을 집어 넣어서 관리
코드를 리팩토링할 때 해당 집합에 관한 로직 수정 시 이 부분만 수정하면 되므로 코드 리팩토링 시 강점

profile
제로부터시작하는코딩생활

0개의 댓글