#Factory Method Pattern

 

 

1. 개념

 

팩토리 메서드 패턴(Factory method pattern)은 객체를 생성하는 공장을 만드는 것으로서

어떤 객체를 만드는 지는 자식클래스에서 결정하게 하는 디자인 패턴이다.

 

 

2. Why? 왜 사용해야 할까?

 

그렇다면 이 팩토리 메서드 패턴을 왜 사용해야 할까?

한마디로 말하자면

객체 간의 결합도를 낮추고 유지보수를 용이하게 하기 위해서이다.

 

객체만 생성하는 공장을 통해서 간접적으로 객체를 생성하게 하며

인터페이스를 정의하되, 실제 구현내용은 자식클래스에서 구현이 되므로

세부 구현 코드를 몰라도 부모클래스에서 자유롭게 사용이 가능하여

객체 간의 결합도가 낮아지는 효과를 볼 수 있다.

 

객체 간의 결합도가 낮춰진다는 말은

한 클래스에 변화가 생겼을 때 다른 클래스에 영향이 끼치는 정도가 낮아진다는 말이고

유지보수를 할 때 최소의 클래스만 수정이 가능하게 되어

유지보수가 용이하게 되는 결과를 낳는다.

 

3. 장점

 

팩토리 메서드 패턴은

직접 객체를 생성하는 것이 아니라

객체만을 생성하는 공장을 만들어서

객체 생성을 중간 매개체인 공장에서 불러오는 것이다.

객체들은 한 공장에서만 생성되기 때문에

객체들을 한 곳에서 관리할 수 있다는 장점이 있으며

객체의 생명주기를 관리하기 쉬워진다.

 

동일한 인터페이스에서 구현이 되기 때문에

새로운 클래스가 추가되거나 확장하게 되어도

기존 소스코드를 변경할 필요 없이 새로운 하위 클래스를 만들면 되기 때문에

새로운 객체를 생성하는 것보다 유연하고 확장성 있는 구조가 된다.

 

프로그램 내에서 동일한 객체의 호출이 잦고

객체를 생성하는 비용이 클경우

객체를 반복하여 반환하여 사용할 경우 성능을 높일 수 있다.

 

또한,

생성자가 아닌 메소드로 작동하기 때문에 리턴 값을 가질 수 있다.

이는 리턴 값으로 상황에 따라 서로 다른 객체를 반환 할 수 있다는 뜻이다.

객체를 선택함에 있어서 유연함을 가질 수 있는 방법이다.

 

 

4. 단점

 

다만, 팩토리 메서드는 계속해서 새로운 하위클래스를 정의한다는 점이 있다.

이는 불필요하게 많은 클래스를 정의하게 될 수 있고

이로 인해 복잡해 질 수 있다는 단점이 있다.

 

 

5. 클래스 다이어그램

 

 

6. 예제 코드

 

우선, Furniture 인터페이스 하위에 DeskMaker, ChairMaker, BedMaker 하위 클래스가 존재한다.

public interface Furniture {
	
	public void make();
	
	public void newDesign();

}

public class DeskMaker implements Furniture{

	public DeskMaker() {
		System.out.println("책상메이커 삼삼대기");
	}

	@Override
	public void make() {
		System.out.println("책상을 만들었습니다.");
	}
	
	@Override
	public void newDesign() {
		System.out.println("새로운 책상 디자인을 연구합니다.");
		
	}
}

public class ChairMaker implements Furniture{

	public ChairMaker() {
		System.out.println("의자메이커 삼삼대기");
	}
	
	@Override
	public void make() {
		System.out.println("의자를 만들었습니다.");
	}
	
	@Override
	public void newDesign() {
		System.out.println("새로운 의자 디자인을 연구합니다.");
		
	}
}

	public BedMaker() {
		System.out.println("침대메이커 삼삼대기");
	}

	@Override
	public void make() {
		System.out.println("침대를 만들었습니다.");
	}

	@Override
	public void newDesign() {
		System.out.println("새로운 침대 디자인을 연구합니다.");
		
	}
}

 

클라이언트, 즉 Ikea는 각 가구를 생성하기 위해 IkeaFactory를 통해 객체를 불러들인다.

IkeaFactory는 입력받은 값으로 불러올 객체를 구분한다.

public class Ikea {

	public static void main(String[] args) {
		
		IkeaFactory ikeaFactory = new IkeaFactory();
		
		System.out.println("주문 1: 책상 생성");
		ikeaFactory.order("책상").make();
		
		System.out.println("주문 2: 의자 생성");
		ikeaFactory.order("의자").make();
		
		System.out.println("주문 3: 침대 디자인 연구");
		ikeaFactory.order("침대").newDesign();
		
	}

}

public class IkeaFactory {
	
	public Furniture order(String type){
		
		if (type == "침대") {return new BedMaker();}
		if (type == "의자") {return new ChairMaker();}
		if (type == "책상") {return new DeskMaker();}
		
		return null;
		
	}

}

 

main으로 부터 나온 결과값은 다음과 같다.

 

7. 참고

http://egloos.zum.com/ani2life/v/2887675

https://m.blog.naver.com/itperson/220885347418

https://xxxelppa.tistory.com/36

http://egloos.zum.com/sakula99/v/2976589

 

Made by 꿩

'스터디 > GoF의 디자인패턴' 카테고리의 다른 글

Chain of Responsibility  (0) 2019.05.06
Strategy Pattern  (0) 2019.04.30
Template Method Pattern  (0) 2019.04.30
Decorator Pattern  (0) 2019.04.28

+ Recent posts