- 개요
- 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 책임지도록 한다.
- 구조 예
- 소스
public class Unit {
protected void move() {
System.out.println("Unit move");
}
protected void attack() {
System.out.println("Unit attack");
}
}
public class Marine extends Unit {
protected void attack() {
System.out.println("Marine move");
}
protected void move() {
System.out.println("Marine attack");
}
}
public class Battlecruiser extends Unit {
protected void attack() {
System.out.println("Battlecruiser move");
}
protected void move() {
System.out.println("Battlecruiser attack");
}
}
public abstract class Factory {
abstract Unit createUnit();
public void operation() {
Unit unit = createUnit();
unit.move();
unit.attack();
}
}
public class Barrack extends Factory {
Unit createUnit() {
return new Marine();
}
}
public class StarPort extends Factory {
Unit createUnit() {
return new Battlecruiser();
}
}
public class Client {
public static void main(String[] args) {
Factory barrack = new Barrack();
barrack.operation();
Factory starPort = new StarPort();
starPort.operation();
}
}
- 구현 관련
- Unit이 추가될때 마다 Unit의 SubClass와 Factory의 SubClass가 추가된다. 이렇게 하지 않는 방법중에 하나는 다음과 같은 것도 있다. 단점으로는 '객체지향 소프트웨어 설계 5원칙중' OCP를 위반한다. 즉, Unit이 추가될 때 코드의 수정이 일어난다.
- c++에서는 Barrack과 StarPort class에 대해 다음과 같이 template 기법을 사용해도 된다.
- template <class T>
- class ConcreateFactory : public Factory {
- protected :
- Unit* createUnit() {
- return new T;
- }
- }
- // 사용할 때 ==>
- // ConcreateFactory<Marine> marine;
- // marine.operation();
- 위의 예는 operation()가 template method와 같이 로직을 구현한 부분이다. 로직이 없는 경우에는 operation()이 없어도 된다.
- 차이점
- abstrat factory와 비슷하지만 families(집단, 군)를 강조하지 않는다.
- factory method는 상속으로 객체를 생성하고, prototype은 delegation로 객체를 생성한다.
- 참고
- factory method 설명 : http://sourcemaking.com/design_patterns/factory_method
- c# example : http://sourcemaking.com/design_patterns/factrory_method/c%2523
- c++ example : http://sourcemaking.com/design_patterns/factory_method/cpp/1
- indexer를 사용한 c++ example : http://sourcemaking.com/design_patterns/factory_method/cpp/2
- wikipedia : http://en.wikipedia.org/wiki/Factory_method_pattern
-