프로그래밍/디자인패턴

디자인 패턴 - Factory Method (Creational Pattern)

aiemag 2021. 2. 26. 12:04
반응형

Creational Pattern인 Factory Method Pattern에 대해 정리합니다.

 

Factory naming 그대로 공장에서 같은 개체를 찍어 내는 패턴입니다.

 

 


Definition

 

Factory Method 는 instance를 생성하는 공장을 Template Method 패턴으로 구성한 패턴입니다.

 

instance를 만드는 방법을 상위 class에서 결정하고, 구체적인 내용은 모두 하위 class에서 구현합니다.

 


Class Diagram

Creator 가 Product를 생성하는 역할을 합니다.

Creator class는 Template Method 패턴으로 구현됩니다.

 


Sample Case

다음은 Factory Method 패턴을 적용한 시나리오입니다.

 

Scenario

이번에 우리 회사는 사업 영역을 확장하여 테슬라 저리 가는 자동차를 생산하기로 하였습니다.

그래서 자동차 생산 공장(CarFactory)을 만들었는데, 자동차(Car)마다 고유 id를 부여(makeProduct())하여 만들고, 창고에 보관(keepProduct())하는 flow(create())를 가지고 있습니다.

 

기존의 생산 공장 기반(Factory)을 사용하였기 때문에 create(), makeProduct(), keepProduct()의 처리 flow는 자동차 공장(CarFactory)에서도 동일합니다.

 

Class Diagram

Factory - CarFactory는 전형적인 Template Method 패턴을 따릅니다.

Abstract class인 Factory가 사용하는 Product도 Abstract 화 하여 사용하도록 되어 있습니다.

 

Code

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import concrete.CarFactory;
import framework.Factory;
import framework.Product;
 
public class Main {
 
    public static void main(String[] args) {
        Factory factory = new CarFactory();
        Product car1 = factory.create("BA_1");
        Product car2 = factory.create("WAA_12");
        car1.use();
        car2.use();
    }
}
cs

 

1
2
3
4
5
6
package framework;
 
public abstract class Product {
    public abstract void use();
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package framework;
 
public abstract class Factory {
    
    public final Product create(String id) {
        Product p = makeProduct(id);
        keepProduct(p);
        return p;
    }
    
    protected abstract Product makeProduct(String id);
    protected abstract void keepProduct(Product product);
}
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package concrete;
 
import framework.Product;
 
public class Car extends Product{
    private String id;
    
    Car(String id){
        this.id = id;
        System.out.println("car id("+this.id+") is created.");
    }
    
    public void use() {
        System.out.println("car id("+this.id+") is driving.");
    }
    
    public String getId() {
        return this.id;
    }
}
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package concrete;
 
import java.util.ArrayList;
 
import framework.Factory;
import framework.Product;
 
public class CarFactory extends Factory{
    
    private ArrayList ids = new ArrayList();
    
    protected Product makeProduct(String id) {
        return new Car(id);
    }
    
    protected void keepProduct(Product product) {
        this.ids.add(product);
    }
    
    public ArrayList getIds() {
        return this.ids;
    }
}
cs

 

 

 

실행 결과

 

반응형