도담이 먹여 살려야하는 집사

Factory-Method Pattern 본문

Design Pattern

Factory-Method Pattern

천재도담 2020. 9. 2. 20:31

객체를 생성하는 인터페이스를 미리 정의하고 어떤 클래스의 인스턴스를 생성할 지에 대한 결정은 서브클래스에서 이루어지도록 하는 패턴 

즉 부모(상위)클래스에서 미리정하고 자식(하위)클래스에서 결정 (객체 생성을 대신 수행해주는 공장이라고 생각 하기)

 

서브클래스에 인스턴스 결정 및 책임을 위임하는 패턴으로 Abstract Factory 와  Template Method 패턴에 활용할 수 있음.

서브 클래스에 대한 hook(객체별로 서로 다른 버전을 제공하는 기능) 메소드를 제공하는 패턴이다. 

 

장점 

직접 객체를 생성하는 것이 아니라 객체만 생성하는 factory를 만들어서 객체 생성을 중간 매개체인 공장에 불러오는 것 

객체들은 한 공장에서만 생성되기 때문에 객체들을 한곳에서 관리할 수 있고 객체의 생명주기를 관리하기 쉬워짐.

 

동일한 인터페이스에서 구현되기때문에 새로운 클래스가 추가되거나 확장하게되어도 기존 소스코드를 변경할 필요없니 하위클래스를 만들면 되기때문에 새로운 객체를 생성하는 것 보다 유연하고 확장성 있는 구조가 됨.

 

프로그램 내에서 동일한 객체의 호출이 잦고 객체를 생성하는 비용이 클 경우 객체를 반복하여 반환하여 사용할 경우 성능을 높일 수 있음 

 

생성자가 아닌 메소드로 작동  -> 리턴값을 가질 수 있음 -> 리턴값으로 상황에 따라서 서로 다른 객체를 반환할 수 있다는 뜻 

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

단점 

계속해서 하위클래스를 정의하기때문에 불필요하게 많은 클래스를 정의 하게되어 복잡해질 수 있다는 점 

팩토리 메소드 패턴 클래스 다이어그램

package FrameWork;

public abstract class ProductCreator {
	public Product create() {
		Product product;
		//step1 
		setProductInfo();
		//step2
		product = buyProduct();
		//step3
		manageProduct();
		
		return product;
	}
	//판매자는 제품을 데이터베이스에 등록 
	abstract protected void setProductInfo();
	//판매자는 제품에 대한 재고관리
	abstract protected void manageProduct();
	//구매자가 제품을 삼 
	abstract protected Product buyProduct();
	
}
package FrameWork;

public interface Product {
	public void buy();
}
package Concrete;

import FrameWork.Product;
import FrameWork.ProductCreator;

public class TvProduct extends ProductCreator {

	@Override
	protected void setProductInfo() {
	System.out.println("판매자가 Tv 정보를 입력했습니다.");
		
	}

	@Override
	protected void manageProduct() {
	System.out.println("Tv 재고관리 완료");
		
	}

	@Override
	protected Product buyProduct() {
		
		return new TV();
	}

}
package Concrete;

import FrameWork.Product;

public class TV implements Product {

	@Override
	public void buy() {
		System.out.println("구입 성공!");
		
	}

}
package Concrete;

import FrameWork.Product;
import FrameWork.ProductCreator;

public class ProductMain {

	public static void main(String[] args) {
		ProductCreator creator;
		Product product;
		
		creator = new TvProduct();
		product = creator.create();
		product.buy();

	}

}

 

클래스다이어그램 출처 johngrib.github.io/wiki/factory-method-pattern/

 

 

'Design Pattern' 카테고리의 다른 글

Abstract Factory Pattern  (0) 2020.09.03
Template Method Pattern  (0) 2020.09.01
Design Pattern  (0) 2020.09.01
Comments