※ CS 스터디/디자인 패턴

2. 팩토리 패턴 ( Factory Pattern )

J 크 2023. 8. 2. 01:46
728x90
반응형

 재미있다~

본 게시글은  : 면접을 위한 CS 전공지식 노트 (출판사 : 길벗, 주홍철 지음) 을 참조하여 작성하였습니다. + 구글링


♣ 팩토리 패턴 ( Factory Pattern )?

인스턴스 생성 부분을 떼어내 추상화한 패턴

-  상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정

-  하위 클래스에서 인스턴스 생성에 관한 구체적인 내용을 결정.

인스턴스 생성부를 캡슐화 하여 결합을 느슨하게 함.

즉, 부모 클래스에 알려지지 않은 클래스를 생성하여 , 자식 클래스가 어떤 인스턴스를 생성할 지 결정

 

♣ Why 팩토리 패턴 ??

- 인스턴스를 생성하는 코드를 분리하여 수정이 일어날 가능성이 큰 부분과 그렇지 않은 부분을 분리

  (객체를 생성하기 위해 인터페이스를 정의)

-  생성할 객체 타입을 예측할 수 없을 때, 상속 받아 원하는 타입의 객체를 생성

기존 코드를 수정하지 않고 새로운 인스턴스를 다른 방법으로 생성하고자 할 때

 

♣ 팩토리 패턴의 단점

- 클래스가 많아짐에 따라 코드가 많아질 수 있는 가능성 상승

- 이에 따라 코드 가독성이 하락될 수 있음


♣ 예시 코드

// 팩토리 패턴
// - 객체 생성 부분을 떼어내 추상화 한 패턴
// - 상속 관계에 있는 두 클래스에서 상위 클래스가 중요한 뼈대를 결정
// - 하위 클래스에서 객체 생성에 관한 구체적인 내용을 결정하는 패턴.

// 객체 생성 부분을 떼어내 추상화
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() {
		price = -1;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
}

class Latte extends Coffee {
	private int price;
	
	public Latte(int price) {
		this.price = price;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
}


class Americano extends Coffee {
	private int price;

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

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
}

public class FactoryPatternTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Coffee latte = CoffeeFactory.getCoffee("Latte", 4000);
		Coffee americano = CoffeeFactory.getCoffee("americano", 2000);
		
		System.out.println("Factory :: " + latte);
		System.out.println("Factory :: " + americano);
	}

}

 코드 내 핵심 사항 (부모 클래스에 알려지지 않은 클래스를 생성하여 , 자식 클래스가 어떤 인스턴스를 생성할 지 결정)

1.  Coffee 라는 추상화 클래스를 통해 인스턴스 생성 부분을 추상화

2. CoffeFactory 라는 서브클래스에서 조건에 맞게 인스턴스 타입을 결정. 

3. 다양한 타입의 클래스를 생성. (Americano, Latte 등)

4. main 문에서 다른 타입의 인스터를 활용하여 출력.

 

 제가 C++을 사용하다가 Java로 전환 중이라 객체라는 단어를 너무 많이 사용하고 있네요. 완전히 같다고 말할 수는 없지만 본글에서는 객체 = 인스턴스로 봐주시면 될 것 같습니다!

 위의 글과 관련하여 추가적인 내용이나 피드백은 언제나 환영입니다 :)