본문 바로가기
java/디자인패턴

팩토리 메서드 패턴

by 문자메일 2023. 2. 14.
  • 인스턴스 작성을 하위 클래스에 위임
  • Template Method 패턴을 인스턴스 생성에 적용함

의도

  • 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 상속받은 서브 클래스에서 구현함
  • 여러 상황, 조건에 따라 각각 생성할 수 있는 객체에 대한 생성을 하위 클래스에 위임함
  • 생성과 관련된 동일한 메서드는 상위 클래스에서 처리한다.

 

 

 

 

 

package factorymethod;

public abstract class CarFactory {

	public abstract Car createCar(String name);
	
	public abstract Car returnCar(String name);
	
	public void numbering() {
		System.out.println("numbering");
	}
	
	public void washCar() {
		System.out.println("WashCar");
	}
	
	// 이 부분이 템플릿 메서드라 할 수 있다.
	final public void sellCar(String name) {
		numbering();
		createCar(name);
		washCar();
	}
}

 

package factorymethod;

import java.util.HashMap;

public class HyundaiCarFactory extends CarFactory{

	HashMap<String, Car> carMap = new HashMap<String, Car>();

	@Override
	public Car createCar(String name) {
		Car car = null;
		
		if (name == "sonata") {
			car = new Sonata();
		}
		else if (name == "santafe") {
			car = new Santafe();
		}
		
		return car;
	}
	
	//팩토리 패턴에서 아래와 같이 이미 생성된 인스턴스는 저장하여 관리하고, 없는 인스턴스만 생성하는 방식으로 사용할 수 있다.
	public Car returnCar(String name) {
		Car car = carMap.get(name);
		
		if(car == null) {
			if(name.equals("Tomas")) {
				car = new Sonata();
			}
			else if(name.equals("James"))
			{
				car = new Santafe();
			}
			carMap.put(name, car);
		}
		return car;
	}

}

 

package factorymethod;

public abstract class Car {
	String carType;
	
	public String toString() {
		return carType;
	}
	
	
}

 

package factorymethod;

public class Santafe extends Car{
	
	public Santafe() {
		carType = "santafe";
	}

}

 

package factorymethod;

public class Sonata extends Car{

	public Sonata() {
		carType = "Sonata";
	}
	
}

 

package factorymethod;

public class CarTest {

	public static void main(String[] args) {
		CarFactory factory = new HyundaiCarFactory();
		Car newCar = factory.createCar("sonata");
		
		System.out.println(newCar);
		
		Car myCar = factory.returnCar("Tomas");
		Car hisCar = factory.returnCar("Tomas");
		
		//이름이 같으면 같은 인스턴스를 관리해서 리턴해준다는 것을 알 수 있다.
		System.out.println(myCar == hisCar);
	}


}

'java > 디자인패턴' 카테고리의 다른 글

어뎁터 패턴 (adapter pattern)  (0) 2023.02.03
프록시, 데코레이터 패턴  (0) 2022.10.09
전략 패턴, 템플릿 콜백 패턴  (0) 2022.10.08
전략 패턴  (0) 2022.10.03
템플릿 메서드 패턴  (0) 2022.10.02

댓글