Java

[Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern)

구루싸 2020. 6. 13. 23:00
반응형
SMALL

지난 학습에서 Template Method 패턴이

상위 클래스에서 처리 골격을 만들고

하위 클래스에서 구체적인 처리를 하는 것을 확인하였는데

오늘의 학습 주제인 Factory Method Pattern은

인스턴스를 생성하는 공장을

Template Method 패턴으로 구성한 것입니다

템플릿 메소드 패턴에 대해 궁금하시다면

아래의 링크↓

2020/06/11 - [Java] - [Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)

 

[Design Pattern] 템플릿 메소드 패턴(Template Method Pattern)

오늘 하루도 어느덧 저물어 가네요 날씨가 더워져서 코로나19로 인한 마스크 착용이 더욱 괴롭게 느껴집니다 하루 빨리 코로나19에 대한 백신이 개발되어 안정되기 바랍니다 아무튼 오늘도 디자

yssa.tistory.com

아래의 표는 팩토리 메소드 패턴을 구성하는

역할들을 정리한 것입니다

역할 설명
제품(Product) 인스턴스가 가져야 할 인터페이스를 결정
작성자(Creator) new를 사용한 인스턴스 생성 대신 메소드를 호출해서 클래스 이름에 의한 속박에서 상위 클래스를 자유롭게 함
구체적인 제품(Concrete Product) 구체적인 제품을 결정
구체적인 작성자(Concrete Creator) 구체적인 제품을 만드는 클래스를 결정

역시 글만으로는 확실히 감이 안오네요-_-

자 이제 실제로 구현해보겠습니다

1. 추상 클래스(Abstract Class) Factory.java

package factoryMethodPattern.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);
}

2. 추상 클래스(Abstract Class) Product.java

package factoryMethodPattern.framework;

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

3. 클래스(Class) IDCard.java

package factoryMethodPattern.idCard;
import factoryMethodPattern.framework.*;

public class IDCard extends Product {
	private String owner;
	IDCard(String owner) {
		System.out.println("make " + owner + "'s card");
		this.owner = owner;
	}
	public void use() {
		System.out.println("use " + owner + "'s card");
	}
	public String getOwner() {
		return owner;
	}
}

4. 클래스(Class) IDCardFactory.java

package factoryMethodPattern.idCard;
import java.util.*;

import factoryMethodPattern.framework.*;
public class IDCardFactory extends Factory {
	private List<String> owners = new ArrayList<String>();
	protected Product createProduct(String owner) {
		return new IDCard(owner);
	}
	protected void registerProduct(Product product) {
		owners.add(((IDCard)product).getOwner());
	}
	public List getOwners() {
		return owners;
	}
}

5. 클래스(Class) Test.java

import factoryMethodPattern.framework.*;
import factoryMethodPattern.idCard.*;
public class Test {
	public static void main(String[] args) {
		/* Factory Method Pattern */
		Factory factory = new IDCardFactory();
		Product card1 = factory.create("Cameron");
		Product card2 = factory.create("Ben");
		Product card3 = factory.create("July");
		card1.use();
		card2.use();
		card3.use();
	}
}

위의 코드를 살펴보면

factoryMethodPattern.framework 패키지에

두 개의 추상 클래스가 있고

이 두 클래스가 인스턴스 생성을 위한

골격의 역할을 합니다

factoryMethodPattern.idCard 패키지에

두 개의 클래스는

실제로 구체적인 구현을 합니다

자세히 보면

factoryMethodPattern.framework 패키지에서

factoryMethodPattern.idCard 패키지를

import하지 않기 때문에

새로운 Product와 Factory를 추가하더라도

framework는 수정할 필요가 없습니다

이 패턴 역시 지난 시간의 템플릿 메소드 패턴과

마찬가지로 소스를 이해하지 못하면

본래 의도했던 바와 다르게

수정이 가해질 가능성이 생기게됩니다

지금까지 팩토리 메소드 패턴에 대해

학습했는데 추후에 학습할 Composite 패턴을

Product 역할이나 Concrete Product 역할에

적용할 수도 있습니다

지금까지 학습했던 내용이

기억안나신다면 아래의 링크↓

2020/06/08 - [Java] - [Design Pattern] 반복자 패턴(Iterator Pattern)

 

[Design Pattern] 반복자 패턴(Iterator Pattern)

아직 6월 초인데 한 여름 마냥 날씨가 급격하게 더워져서 출퇴근 길에 땀이 흥건...하... 30도 가까이 되는 지역도 있더라고요 코로나19도 끝날 기미가 보이지 않는데 몸 관리 잘하시길 바랍니다 ��

yssa.tistory.com

2020/06/09 - [Java] - [Design Pattern] 어댑터 패턴(Adapter Pattern)

 

[Design Pattern] 어댑터 패턴(Adapter Pattern)

오늘 하루도 끝나가네요-_- 시간은 왜 이리도 빠른지 도전해 보고 싶은 것은 많은데 나이만 먹는거 같네요ㅜㅜ 아무튼 오늘은 지난 시간에 이어서 디자인 패턴 중 어댑터 패턴에 대해 학습하겠��

yssa.tistory.com

이것으로 오늘의 학습을 마치고

다음 시간에 Singleton은 하나의 인스턴스만 갖는

Singleton 패턴에 대해 학습하겠습니다

그럼 이만-_-

반응형
LIST