Computer Science

디자인 패턴 - 팩토리 패턴

ds3hfj 2025. 4. 22. 14:45

팩토리 패턴

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

 

상위클래스와 하위클래스가 분리되기 때문에 느슨한 결합을 가지며 상위 클래스에서는 인스턴스 생성방식에 대해 전혀 알필요가 없으므로 더 많은 유연성을 갖게됨

 

객체 생성 로직이 따로 떼어져 있어서 코드를 리팩토링 하더라도 한곳만 고칠수 있게 되니 유지보수성 증가

 

자바스크립트 팩토리 패턴

const num = new Object(42)
const str = new Object('abc')
num.constructor.name; // Number
str.constructor.name; // String
class CoffeeFactory {
	static createCoffee(type) {
    	const factory = factoryList[type]
        return factory.createCoffee()
    }
}
class Latte {
	constructor() {
    	this.name = "latte"
    }
}
class Espresso {
	constructor() {
    	this.name = "Espresso"
    }
}
class LatteFactory extends CoffeeFactory{
	static createCoffee() {
    	return new Latte()
    }
}
class EspressoFactory extends CoffeeFactory{
	static createCoffee() {
    	return new Espresso()
    }
}
const factoryList = { LatteFactory, EspressoFactory}

const main = () => {
	// 라떼 커피를 주문한다.
    const coffee = CoffeeFactory.createCoffee("LatteFactory")
    // 커피 이름을 부른다.
    console.log(coffee.name) // latte
}
main()

 

CoffeeFactory 라는 상위 클래스가 중요한 뼈대를 결정하고 하위 클래스인 LatteFactory가 구체적인 내용을 결정하고 있음

 

의존성 주입이라고 볼수 있다 CoffeeFactory에서 LatteFactory의 인스턴스를 생성하는게 아닌 LatteFactory에서 생성한 인스턴스를 CoffeeFactory에 주입하고 있기 때문

 

CoffeeFactory 클래스를 보면 static 키워드를 통해 createCoffee()메서드를 정적 메서드로 선언한 것을 볼수 있는데, 이는 클래스를 기반으로 객체를 만들지 않고 호출이 가능하며, 해당 메서드에 대한 메모리 할당을 한번만 할 수 있다는 장점이 있다.

 

 

enum CoffeeType {
	LATTE,
    ESPRESSO
}

abstract class Coffee {
	protected String name;
    
    public String getName() {
    	return name;
    }
}

class Latte extends Coffee {
	public Latte() {
    	name = "latte";
    }
}

class Espresso extends Coffee {
	public Espresso() {
    	name = "Espresso";
    }
}

class CoffeeFactory {
	public static Coffee createCoffee(CoffeeType type) {
    	switch (type) {
        	case LATTE:
            	return new Latte();
            case ESPRESSO:
            	return new Espresso();
            default:
            	throw new IllegalArgumentException("Invalid coffee type:" + type);
        }
    }
}

public class Main {
	public static void main(String[] args) {
    	Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
        System.out.println(coffee.getName()); // latte
    }
}

 

Enum

상수의 집합을 정의할때 사용되는 타입. 월, 일 , 색상 등의 상수 값을 담는다.

자바에서는 Enum이 다른 언어보다 더 활발히 활용되며, 상수 뿐 아니라 메서드를 집어넣어 관리할 수도 있다.

Enum을 기반으로 상수 집합을 관리하면 코드를 리팩터링 할때 상수 집합에 대한 로직 수정 시 이 부분만 수정하면 된다는 장점

스레드세이프( 하나의 프로그램 안에서 동시에 실행되는 작업 흐름 )하기 때문에 싱글톤 패턴을 만들때 도움이 된다.