본문 바로가기

Computer Science/Design Pattern

[디자인 패턴] Factory 패턴

정의

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

 

즉, 객체를 생성하는 인터페이스를 미리 정의하지만, 인스턴스를 만들 클래스의 결정은 서브 클래스 쪽에서 결정하는 패턴이다. 여러개의 서브 클래스를 가진 슈퍼 클래스가 있을때, 들어오는 인자에 따라서 하나의 자식클래스의 인스턴스를 반환해주는 방식이다. 팩토리 패턴은 클래스의 인스턴스를 만드는 시점 자체를 서브 클래스로 미루는 것이다.

 

팩토리 패턴을 요악해서 말하면, 객체 생성을 대신 수행해주는 공장이라고 표현할 수 있다.

팩토리 패턴 장점

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

- 객체 생성 로직이 따로 떼어져 있기 때문에, 코드를 리팩터링 하더라도 한 곳만 고칠 수 있어서 유지 보수성이 증가한다.

 

팩토리 패턴 단점

- 새로 생성할 객체가 늘어날 때마다, Factory 클래스에 추가해야 하기 때문에 클래스가 많아진다.

자바의 팩토리 패턴

Coffee.java

abstract class Coffee {
	public abstract int getPrice();

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

CoffeeFactory.java

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();
	}
}

DefaultCoffee.java

class DefaultCoffee extends Coffee {
	private int price;

	public DefaultCoffee() {
		this.price = -1;
	}

	@Override
	public int getPrice() {
		return this.price;
	}
}

Latte.java

class Latte extends Coffee{
	private int price;

	public Latte(int price) {
		this.price = price;
	}
	
	@Override
	public int getPrice() {
		return this.price;
	}
}

Americano.java

class Americano extends Coffee {
	private int price;

	public Americano(int price) {
		this.price = price;
	}

	@Override
	public int getPrice() {
		return this.price;
	}
}

Main.java

public class Main{
	public static void main(String[] 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 lattee ::Hi this coffee is 4000
Factory ame ::Hi this coffee is 3000
*/

 

참고 자료

면접을 위한 CS 전공지식 노트 - 주홍철

https://niceman.tistory.com/143

https://velog.io/@lsj8367/%EC%9E%90%EB%B0%94-%ED%8C%A9%ED%86%A0%EB%A6%AC%ED%8C%A8%ED%84%B4