- 인스턴스 작성을 하위 클래스에 위임
- 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 |
댓글