본문 바로가기
기타/자바 디자인패턴

[자바 디자인패턴] 3. Factory Method 패턴

by 창이2 2022. 8. 14.

Factory Method 패턴 이란?

Factory Method 패턴은  생성패턴에 속하는 디자인 패턴이다.

이전 포스팅에서 템플릿 메서드 패턴을 통해 틀을 만들고 이를 구현하는 방법을 배웠다.

Factory Method 패턴은 이 템플릿 메서드 패턴을 바탕으로 

인스턴스를 생성하는 틀을 상위 클래스에서 만들고 하위 클래스에서 이를 구현한다.

즉 인스턴스 생성 Template 과 구현하는 로직을 분리해놓은 패턴이다.

 

예를 들어 신분증명서 카드를 만들고 등록하는 로직을  Factory Method 패턴을 통해 구현해보면

아래와 같이

 

Factory 클래스와 Card클래스를 상위 클래스로 생성한다.

Factory 클래스는 객체 생성에 대한 틀이 구현되어 있다.

Card 클래스는 Factory클래스에서 참조하는 객체의 추상 클래스이다.

 

그리고 이 상위 클래스를 상속받는 하위 클래스를 생성한다.

이는 각각 IDCardFactory와 IDCard 이다.

 

fun main() {

    val idCardFactory: Factory = IDCardFactory()
    val friendCard1 = idCardFactory.create("friend 1")
    val friendCard2 = idCardFactory.create("friend 2")
    val friendCard3 = idCardFactory.create("friend 3")

    friendCard1.use()
    friendCard2.use()
    friendCard3.use()

    (idCardFactory as IDCardFactory).printUserCardList()
}

//Template Method 패턴이 적용된 class, 상위 클래스에서 틀을 만들었다.
abstract class Factory {
    fun create(userName: String): Card {
        val card: Card = createCard(userName)
        registerCard(card)
        return card
    }

    protected abstract fun createCard(userName: String): Card

    protected abstract fun registerCard(card: Card)
}

abstract class Card {
    abstract fun use()
}

class IDCardFactory : Factory() {
    val userCardList = arrayListOf<IDCard>()

    override fun createCard(userName: String): Card {
        return IDCard(userName)
    }

    override fun registerCard(card: Card) {
        if (card is IDCard) {
            userCardList.add(card)
        }
    }

    fun printUserCardList() {
        println()
        println(userCardList)
    }
}

data class IDCard(val userName: String) : Card() {
    override fun use() {
        println("${userName} - 카드 신원조회 됐습니다.")
    }
}

 

참고 : 자바언어로 배우는 디자인패턴 입문

댓글