프로그래밍/Design_Pattern

[Design_Pattern] 팩토리 메서드 패턴(Factory Method Pattern)

Lim-Ky 2017. 8. 28. 21:55
반응형

안녕하세요 Limky입니다.

이번시간은 팩토리 메서드 패턴(Factory Method Pattern)에 대해서 알아보겠습니다.

 

팩토리 메서드 패턴(Factory Method Pattern)의 팩토리 메소드는 객체를 생성해서 반환하는 것을 말합니다. 즉 결과 값이 객체인 것입니다. 디자인 테이블과 예제를 보면서 바로 알아보겠습니다.

 

 

구체클래스는 인퍼페이스를 implements하지만, 저는 추상클래스로 구현 형식을 강제해보겠습니다. 예제에서는 추상클래스안에 추상메서드를 두었고, 구체클래스가 이를 재정의해서 구현하도록 설계했습니다. 

 

먼저 Pizza라는 추상클래스를 두고 각 구체적인 토마토,페페로니 피자인 구체클래스들은 상속을 받아 각자의 스타일에 맞게 구현합니다.  마찬가지로 Factory 추상클래스를 만들고 상속을 받은 구체클래스 즉 팩토리 메서드를 가지고 있는 클래스인 PizzaFactory가 상속 재구현 합니다.

 

팩토리 메서드에 name매개변수를 받아 어떤 구체클래스의 객체를 반환할지 분기 처리 합니다. 

아래 코드를 보면서 마무리 하겠습니다.

 

 

 

Pizza.java

public abstract class Pizza {
	
	public abstract String getNmae();

}
 

TomatoPizza.java

public class TomatoPizza extends Pizza{

	@Override
	public String getNmae() {
		return "TomatoPizza";
	}

}

PepperoniPizza.java

public class PepperoniPizza extends Pizza{

	@Override
	public String getNmae() {
		return "PepperoniPizza";
	}

}
Factory.java
public abstract class Factory {

	public abstract Pizza createPizza(String name);
}
PizzaFactory.java
public class PizzaFactory extends Factory{

	@Override
	public Pizza createPizza(String name) {

		switch (name) {
		case "Tomato": return new TomatoPizza(); 
		case "Pepperoni":return new PepperoniPizza();
		}
		
		return null;
	}

	
}
Main.java
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		PizzaFactory pizzaFactory = new PizzaFactory();
		Pizza pizza1 = pizzaFactory.createPizza("Tomato");
		Pizza pizza2 = pizzaFactory.createPizza("Pepperoni");
		
		System.out.println(pizza1.getNmae()+"\n");
		System.out.println(pizza2.getNmae()+"\n");
	}

}

 

 

*결과 값

TomatoPizza

PepperoniPizza

 

 

팩토리 메서드 패턴을 사용할 때 이점이 무엇이 있을까요?

바로 결합도를 낮춰서 얻을 수 있는 이점이라 보시면 됩니다. 클래스의 변경사항이 생겼을 때 얼마나 다른 클래스에게도 영향을 줄 것인가가 결합도인데 팩토리 메서드 패턴은 직접 사용하는 객체를 생성하지 않고 팩토리 메서트 클래스를 통해 객체를 대신 생성시키고 그 객체를 반환 받아 사용하기 때문에 효율적인 코드 제어를 할 수 있을 뿐더러 결합도를 낮춰 유지보수가 용이합니다.

 

 

 

 

 

반응형