[Design Pattern] Factory Method 패턴



팩토리 패턴을 이해하기 위해서는 우선 템플릿 패턴을 알아야한다. 왜냐하면 템플릿 패턴에 인스턴스 생성하는 부분까지 추상화 시켰기 때문이다.

팩토리 패턴은 처리 골격을 만들고 상속 받은 클래스가 구체적인 처리를 구현해 놓습니다. 또한 인스턴스를 생성하는 부분까지 맡겼기 때문에 해당 클래스를 호출하는 부분에서는 따로 인스턴스를 만드는 과정을 없앴습니다.


팩토리 메소드 패턴



다목적 공장이 있습니다. 이 공장을 가지고 있으면 철강, 차, 베터리 등등 모든 것을 만들 수 있다. 이 공장을 이용해 차를 만드는 과정을 프로그램화 해보겠다. 다목적 공장에 해당하는 Framework 패키지 안에 Factory와 Product가 있다. 이 공장들을 이용해 차를 만드는 것은 Car 패키지에 Factory를 상속 받은 CarFactory가 Product를 상속받은 Car를 만드는 과정을 알아보겠다.


[클래스 다이어그램]




[framework 패키지에 Product 구현]

다목적 공장에서 생산되는 상품 규격을 정의해 놓은 추상화 클래스 이다.

해당 규격에만 맞게 구현 할 수 있으면 Factory에서 어떠한 제품을 만들어 낼 수 있다.

package framework;


public abstract class Product {

public abstract void use();

}



[framework 패키지에 Factory 구현 ]

Factory 추상화 클래스에서는 Product를 생성한다. 이 클래스를 상속 받은 클래스는 해당 규격에 맞게 구현만 하면 어떠한 공장도 만들어 낼 수 있다.


package framework;


public abstract class Factory {

public final Product create(String owner) {

Product p = createProduct(owner);

registerProduct(p);

return p;

}

protected abstract Product createProduct(String owner);

protected abstract void registerProduct(Product product);

}



[car 패키지에 Car 클래스 구현]

Product를 상속 받아 실제로 차에 대한 기능을 구현 한다.


package car;

import framework.*;


public class Car extends Product {

private String owner;

Car(String owner) {

this.owner = owner;

System.out.println(owner + "의 차를 만듭니다.");

}

@Override

public void use() {

System.out.println(owner + "의 차를 이용합니다.");

}

public String getOwner() {

return owner;

}

}



[car 패키지에 CarFactory 클래스 구현]

Factory를 상속받은 CarFactory 클래스는 Car 클래스 인스턴스를 생성 한다. 더블어 ArrayList 클래스를 이용한 생성한 Car 주인에 대한 관리도 가능하다.


package car;

import framework.*;

import java.util.*;


public class CarFactory extends Factory{


private List owners = new ArrayList();

@Override

protected Product createProduct(String owner) {

return new Car(owner);

}


@Override

protected void registerProduct(Product product) {

owners.add(((Car)product).getOwner());

}

public List getOwners() {

return owners;

}


}



[Main 구현]

만들어 놓은 차 공장을 이용해 차를 생산해 보자.


import car.*;

import framework.*;


public class Main {


public static void main(String[] args) {

Factory factory = new CarFactory();

Car car1 = (Car) factory.create("김순희");

Car car2 = (Car) factory.create("박철수");

car1.use();

car2.use();

for( int i = 0 ; i < ((CarFactory)factory).getOwners().size() ; i++ ) {

System.out.println(((CarFactory)factory).getOwners().get(i));

}

}

}



[실행 결과]


김순희의 차를 만듭니다.

박철수의 차를 만듭니다.

김순희의 차를 이용합니다.

박철수의 차를 이용합니다.

김순희

박철수





반응형

+ Recent posts