이번에는 Factory Method에 대해 알아보려 합니다.
Factory Method의 Factory는 공장이라는 의미인데요. 이 공장은 인스턴스를 생성하는 곳이라 생각하면 됩니다.
이 공장은 전에 배웠던 Template Method패턴으로 구성되어 있습니다.
이 패턴에서는 인스턴스를 만드는 방법을 상위 클래스 측에서 결정하지만 구체적인 클래스 이름까지는 결정하지 않습니다.
구체적인 내용은 모두 하위 클래스 측에서 수행하죠. 그래서 인스턴스 생성을 위한 Framework와 실제의 인스턴스 생성의 클래스를 분리해서 생각 할 수 있게 됩니다.
이제 예제 프로그램을 만들어봅시다!
이번에는 사원증을 만드는 프로그램을 만들어 볼 것인데요. 사원증을 만들기 위해 필요한 공장을 만들어 봅시다.
클래스 다이어그램은 위와 같습니다. 설명은 코드를 설명하면서 차근차근 해보도록 하겠습니다.
먼저 Product 클래스 부터 만들어 봅시다.
package framework;
public abstract class Product {
public abstract void Use();
}
framework 패키지의 Product 클래스는 제품을 표현한 클래스 인데요.
이 클래스 안에는 추상 메소드인 Use만 선언되어 있는데 위의 framework에서는 제품은 무엇이든 사용 할 수 있는 것으로 규정하고 있고, 구체적인 Use의 구현은 Product 하위 클레스에게 맡기고 있어요.
이제 Factory 클래스를 만들어 봅시다.
package framework;
public abstract class Factory {
public final Product Creating(String Employees) {
Product p = CreateSIDCard(Employees);
RegisterSIDCard(p);
return p;
}
protected abstract Product CreateSIDCard(String Employees);
protected abstract void RegisterSIDCard(Product product);
}
framework 패키지의 Factory 클래스에서는 Template Method 패턴이 사용되고 있어요.
여기서 CreateSIDCard는 CreateStaffIDCard를 줄여서 사용한 것이고, RegisterSIDCard는 RegisterStaffIDCard를 줄여서 사용한 것입니다. 원래 변수명을 너무 길게 사용하는 건 좋아하지 않는 편인데, 해당 변수가 어떤 역할을 하는지 자세히 써 보고 싶어 사용하였습니다.
추상 메소드인 CreateSIDCard에서는 사원증을 만들고, 만든 사원증을 추상 메소드인 RegisterSIDCard에서 사원증을 등록해요.
사원증을 만들고, 사원증을 등록하는 구현은 하위 메소드에서 수행하게 되는데요. 위 코드에 있는 framework에서 공장은 Creating메소드에서 Product의 인스턴스를 생성하는 것으로 규정하고 있는데요. Creating의 메소드는 CreateSIDCard 메소드에서 사원증을 만들어 RegisterSIDCard에서 등록하는 순서로 구현되고 있다고 이해하면 됩니다.
지금까지 framework 패키지를 작성해 보았는데요. 이제 SIDCard패키지를 작성해봅시다!
SIDCard패키지는 내용을 실행해주는 패키지로 이해하시면 됩니다.
package SIDCard;
import framework.*;
public class StaffIDCard extends Product {
private String Employee;
StaffIDCard(String Employee) {
System.out.println(Employee + "의 사원증을 만듭니다.");
this.Employee = Employee;
}
public void Use() {
System.out.println(Employee + "의 사원증을 사용합니다.");
}
public String getEmployee() {
return Employee;
}
}
사원번호 카드를 나타내는 StaffIDCard라는 클래스를 만들어보죠. framework에서 분리된 것을 표시하기 위해 SIDCard라는 별도의 패키지를 만들고, StaffIDCard 클래스를 정의 하였습니다.
그 다음 StaffIDCardFactory 클래스를 작성해보죠!
package SIDCard;
import framework.*;
import java.util.*;
public class StaffIDCardFactory extends Factory {
private List Employees = new ArrayList();
protected Product CreateSIDCard(String Employee) {
return new StaffIDCard(Employee);
}
protected void RegisterSIDCard(Product product) {
Employees.add(((StaffIDCard)product).getEmployee());
}
public List GetEmployees() {
return Employees;
}
}
StaffIDCardFactory 클래스에서는 CreateSIDCard와 RegisterSIDCard의 두가지 메소드를 구현하고 있는데요. CreateSIDCard에서는 StaffIDCard의 인스턴스를 생성해서 사원증을 만드는 일을 실행하고 있고, RegisterSIDCard에서는 StaffIDCard의 Employee(사원)를 Employees 필드에 추가해 등록을 실행하고 있습니다.
이제 Main 클래스를 작성해 봅시다.
package bami;
import framework.*;
import SIDCard.*;
public class Main {
public static void main(String[] args) {
Factory factory = new StaffIDCardFactory();
Product SIDCard1 = factory.Creating("홍길동");
Product SIDCard2 = factory.Creating("김바미");
Product SIDCard3 = factory.Creating("이순신");
SIDCard1.Use();
SIDCard2.Use();
SIDCard3.Use();
}
}
framework 패키지와 SIDCard 패키지를 이용하여 실제 StaffIDCard를 만들어 사용하였습니다.
참고 : Java 언어로 배우는 디자인 패턴 입문
'프로그래밍(Basic) > 디자인 패턴(Java)' 카테고리의 다른 글
[바미] Prototype 패턴에 대해 알아봅시다. (0) | 2021.10.04 |
---|---|
[바미] Singleton 패턴에 대해 알아봅시다. (0) | 2021.09.23 |
[바미] 템플릿 메소드(Template Method) 패턴에 대해 알아봅시다. (0) | 2021.09.15 |
[바미] Adapter 패턴에 대해 알아봅시다. (0) | 2021.08.24 |
[바미] Iterator패턴에 대해 알아봅시다. (0) | 2021.08.17 |