디자인패턴

[Java] Factory 패턴

ZzangHo 2022. 4. 5. 23:12
728x90

디자인 패턴 공부용으로 블로그에 기록을 해본다.

공부에 참고한 자료로는 "Java 언어로 배우는 디자인 패턴 입문" 을 참고 하였다.

정의

Factory는 말 그대로 '공장'이라는 의미이다. 인스턴스를 생성하는 공장을 Template Method 패턴으로 구성한 것이 Factory Method 패턴이 된다. Factory 패턴에서는 인스턴스를 만드는 방법을 상위 클래스 쪽에서 결정하지만 구체적인 내용은 모두 하위 클래스 쪽에서 수행한다. 따라서 인스턴스 생성을 위한 골격(framework)과 실제 인스턴스 생성의 클래스를 분리해서 생각할 수 있다.

예제 프로그램

사용자 이름을 입력받아 카드를 만들어주는 공장 형태의 프로그램.

 

클래스 설명

패키지 이름 해설
framework Product 추상 메소드 use만 정의되어 있는 추상 클래스
Factory 메소드 create를 구현하고 있는 추상 클래스
idcard IDCard 메소드 use를 구현하고 있는 클래스
IDCardFactory 메소드 createProduct, registerProduct를 구현하고 있는 클래스
Anonymous Main 동작 테스트용 클래스

 

Product 클래스

package Factory;

public abstract class Product {
    public abstract void use();
}

 

Factory 클래스

package Factory;

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);
}

 

IDCard 클래스

package Factory;

public class IDCard extends Product {
    private String owner;

    IDCard(String owner) {
        System.out.println(owner + "의 카드를 만듭니다.");
        this.owner = owner;
    }

    @Override
    public void use() {
        System.out.println(owner + "의 카드를 사용합니다.");
    }

    public String getOwner() {
        return owner;
    }
}

 

IDCardFactory 클래스

package Factory;

import java.util.ArrayList;
import java.util.List;

public class IDCardFactory extends Factory{
    private List owners = new ArrayList<>();

    @Override
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }

    @Override
    protected void registerProduct(Product product) {
        owners.add(((IDCard)product).getOwner());
    }

    public List getOwners() {
        return owners;
    }
}

 

Main 클래스

package Factory;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();
        Product p1 = factory.create("Lee");
        Product p2 = factory.create("Kim");
        Product p3 = factory.create("Yoo");

        p1.use();
        p2.use();
        p3.use();
    }
}

 

Main을 실행해보면 아래와 같이 출력 된다.

Lee의 카드를 만듭니다.
Kim의 카드를 만듭니다.
Yoo의 카드를 만듭니다.
Lee의 카드를 사용합니다.
Kim의 카드를 사용합니다.
Yoo의 카드를 사용합니다.

Process finished with exit code 0

 

  • Product 클래스는 '제품'을 추상화한 클래스이며 추상 메소드로 use를 선언하고 있다. 이 framework에서 제품이란 '무엇이든 use 할 수 있는 것'으로 규정하고 있다.
  • Factory 클래스에서는 Template Method 패턴이 사용되고 있으며 추상 메소드 createProduct에서는 '제품을 만들고', 만든 제품을 추상 메소드 registerProduct에서 '등록'한다.
  • IDCard 클래스에서는 Product 클래스를 상속받아 use 메소드를 정의 한다.
  • IDCardFactory 클래스에서는 Factory 클래스를 상속받아서 createProduct와 registerProduct 두 가지 메소드를 구현하고 있다. createProduct에서는 IDCard의 인스턴스를 생성하여 '제품을 만드는' 일을 실현하고 있고, registerProduct에서는 IDCard의 owner(소유자)를 owners 필드에 추가하여 '등록'이라는 기능을 실현하고 있다.

 

'디자인패턴' 카테고리의 다른 글

[Java] Singleton 패턴  (0) 2022.04.12
[Java] Prototype 패턴  (0) 2022.04.12
[Java] Template Method 패턴  (0) 2022.04.03
[Java] Adapter 패턴  (0) 2022.04.03
[Java] Iterator 패턴  (0) 2022.03.31