본문 바로가기
Spring/DesighPattern

GOF패턴-FactoryMethod(생성)

by windy7271 2023. 2. 21.
728x90
반응형

FactoryMethod :

객체를 생성하기 위한 인터페이스를 정의하고, 어떤 클래스의 인스턴스를 생성할지에 대한 처리는 서브클래스가 결정하는 디자인 패턴

 

객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화하는 패턴
 객체의 생성 코드를 별도 분리함으로써 객체 생성의 변화에 대비하는 데 유용함

 

역할이 수행하는 작업 Product
팩토리 메서드로 생성될 객체의 공통 인터페이스 ConcreteProduct = Default
구체적으로 객체가 생성되는 클래스 Creator
팩토리 메서드를 갖는 클래스 ConcreteCreator
팩토리 메서드를 구현하는 클래스로 ConcreteProduct 객체를 생성 = Default
https://gmlwjd9405.github.io/2018/08/07/factory-method-pattern.html

 

 

 

 

역할을 수행하는 작업인 Product (Interface Item)

package FactoryMethod.framework;

public interface Item {
    public void use();
}

 

구체적으로 객체가 생성되는 Creator

package FactoryMethod.framework;

public abstract class ItemCreator {
    // 메소드에서 필요한 알고리즘을 단계별로 나눠주고 차례대로 실행하는 형식 > 팩토리메소드
    public Item create() {

        Item item;
        requestItemsInfo(); // 1. 데베에서 아이템정보 호출하고
        item = createItem();// 2. 아이템 생성
        createItemLog(); //    3. 로그 호출
        // 위 부분이 템플릿메소드 이다
        return item;
    }
    // 아이템 정보 요청
    abstract protected void requestItemsInfo();
    //데베에 아이템 생성
    abstract protected void createItemLog();
    // 아이템 생서 알고리즘
    abstract protected Item createItem();
}

이 Creator 안에는 이 전에 배웠던 템플릿 메서드가 사용된다.

메소드에서 필요한 알고리즘을 단계별로 나눠주고 하위 클래스에서 구체적으로 구현하는 템플릿 메서드가 말이다.

 

 

creator 를 상속받아 DefaultCreator 를 구현하는것 

package FactoryMethod.concrete;

import FactoryMethod.framework.Item;
import FactoryMethod.framework.ItemCreator;

import java.util.Date;

public class HpCreator extends ItemCreator {
    @Override
    protected void requestItemsInfo() {
        System.out.println("데이터베이스에서 회복 물약의 정보를 가져옴");
    }

    @Override
    protected void createItemLog() {
        System.out.println("데이터베이스에서 회복 물약을 새로 생성" + new Date());
    }

    @Override
    protected Item createItem() {
        return new Hppotion();
    }
}


package FactoryMethod.concrete;

import FactoryMethod.framework.Item;
import FactoryMethod.framework.ItemCreator;

import java.util.Date;

public class MpCreator extends ItemCreator {
    @Override
    protected void requestItemsInfo() {
        System.out.println("데이터베이스에서 마력 물약의 정보를 가져옴");
    }

    @Override
    protected void createItemLog() {
        System.out.println("데이터베이스에서 마력 물약을 새로 생성" + new Date());
    }

    @Override
    protected Item createItem() {
        return new Mppotion();
    }
}

 

 

 

Default

package FactoryMethod.concrete;

import FactoryMethod.framework.Item;

public class Hppotion implements Item {
    @Override
    public void use() {
        System.out.println("체력 회복");
    }
}

package FactoryMethod.concrete;

import FactoryMethod.framework.Item;

public class Mppotion implements Item {
    @Override
    public void use() {
        System.out.println("마력 회복");
    }
}

팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거한다. 결과적으로 결합도 또한 낮출 수 있다.

 

팩토리 메소드 패턴은 부모 클래스에 알려지지 않은 구체 클래스를 생성 하는 패턴 이며 클래스가 어떤 객체를 생성할지를 결정한다.

 

위 예제로 보면

mpCreator, HpCreator 이 추상메서드를 구현하는 클래스이고

HpPotion, MpPotion 은 Item 에 대한 구현 클래스이다.

 

Item과 ItemCreator 은 생성에 대한 인터페이스 부분 이고 

나머지는 구현에 대한 부분

 

생성에 대한 인터페이스와 생성에대한 구현부분이 완전히 분리되어있다 .

>> 인터페이스 부분이 구현부분을 전혀 모르고 있다.

즉 필요하다면 인터페이스 부분만 별도의 패키지로 분리해서 개발할수있다. (구현부분도 마찬가지)

 

 

 

 

반응형

댓글