객체 지향에서 팩토리(공장)는 객체를 생성한다. 결국 팩토리 메서드는 객체를 생성해 반환하는 메서드를 말한다. 하위 클래스에서 팩토리 메서드를 오버라이딩해서 객체를 반환하게 하는 것을 팩토리 메서드 패턴이라 부른다.
package factoryMethodPattern;
public abstract class Animal {
// 추상 팩터리 메서드
abstract AnimalToy getToy();
}
package factoryMethodPattern;
// 팩터리 메서드가 생성할 객체의 상위 클래스
public abstract class AnimalToy {
abstract void identify();
}
package factoryMethodPattern;
public class Dog extends Animal{
// 추상 팩터리 메서드 오버라이딩
@Override
AnimalToy getToy(){
return new DogToy();
}
}
package factoryMethodPattern;
// 팩터리 메서드가 생성할 객체
public class DogToy extends AnimalToy {
public void identify() {
System.out.println("나는 테니스 공! 강아지 친구!");
}
}
package factoryMethodPattern;
public class Cat extends Animal{
// 추상 팩터리 메서드 오버라이딩
@Override
AnimalToy getToy(){
return new CatToy();
}
}
package factoryMethodPattern;
// 팩터리 메서드가 생성할 객체
public class CatToy extends AnimalToy{
@Override
public void identify(){
System.out.println("나는 캣타워! 고양이 친구~!");
}
}
package factoryMethodPattern;
public class Driver {
public static void main(String[] args) {
// 팩터리 메서드 보유한 객체들 생성
Animal bolt = new Dog();
Animal kitty = new Cat();
// 팩터리 메서드가 반환하는 객체들
AnimalToy boltBall = bolt.getToy();
AnimalToy kittyTower = kitty.getToy();
// 팩터리 메서드가 반환한 객체들 사용
boltBall.identify();
kittyTower.identify();
}
}
나는 테니스 공! 강아지 친구!
나는 캣타워! 고양이 친구~!
코드 흐름은 아래와 같다.
new Dog();
new 연산자를 사용해 Dog
객체를 생성한다. Dog
객체는 팩토리 메서드인 getToy
를 보유하고 있다.
오버라이딩 한 팩토리 메서드 getToy
를 사용해 DogToy
객체를 반환한다.
반환받은 DogToy
객체를 사용해 identify()
메서드를 호출한다.
결국 팩토리 메서드 패턴은 오버라이드된 메서드가 객체를 반환하는 패턴이다.
스프링 입문을 위한 객체지향의 원리와 이해