[디자인 패턴(Design Pattern)] 추상 팩토리(Abstract Factory)

업데이트:

카테고리:

태그:


추상 팩토리 패턴이란?Permalink

추상 팩토리 패턴은 생성 패턴 중의 하나로 구체적인 클래스에 의존하지 않고, 인터페이스를 통해 연관 ∙ 의존하는 객체들의 그룹으로 생성하여 추상적으로 표현하는 패턴이다. 뭔소리냐면 관련된 객체들을 통째로 묶어 팩토리를 만들고 이 팩토리를 조건에 맞게 생성하도록 팩토리를 다시 만든다. 이러한 특징 때문에 Factory Of Factory 패턴이라고도 불린다.

장점Permalink

  • 객체의 생성부를 캡슐화하여 클라이언트 코드와 결합도(의존도)를 낮춘다.
  • 구체적인 클래스를 분리시켜 재사용성을 증진시킨다.

예시 (Kotlin)Permalink

Man 객체 또는 Woman 객체를 생성하는 HumanFactory를 만들어 보자

우선은 Man 클래스와 Woman 클래스의 상위 클래스가 될 Human 클래스를 만든다. 서브 클래스의 인터페이스만 구현할 것이므로 추상 클래스로 만들었다.

abstract class Human{
    abstract var age : Int
    abstract var name : String
    override fun toString(): String {
        return "name : $name , age : $age"
    }
}

다음은 Human 클래스의 서브 클래스인 Man 클래스와 Woman 클래스이다.

data class Man(
    override var age : Int,
    override var name : String
) : Human(){
    override fun toString(): String {
        return "Man - ${super.toString()}"
    }
}
data class Woman(
    override var age : Int,
    override var name : String
) : Human(){
    override fun toString(): String {
        return "Woman - ${super.toString()}"
    }
}

각 서브 클래스는 toString()을 오버라이딩 하여 해당 객체가 Man 객체인지 Woman 객체인지 알 수 있도록 하였다.

각 팩토리들의 인터페이스를 정의한다.

interface HumanAbstractFactory{
    fun createHuman() : Human
}

다음은 Man객체를 생성할 ManFactory와 Woman객체를 생성할 WomanFactory이다.

class ManFactory(
    private val age : Int,
    private val name : String
): HumanAbstractFactory{
    override fun createHuman(): Human {
        return Man(age, name)
    }
}
class WomanFactory(
    private val age : Int,
    private val name : String
): HumanAbstractFactory{
    override fun createHuman(): Human {
        return Woman(age, name)
    }
}

이제 마지막으로 객체를 만들기위해 접근할 HumanFactory이다.

class HumanFactory{
    companion object{
        fun getHuman(factory: HumanAbstractFactory) = factory.createHuman()
    }
}

다음 코드를 통해 HumanFactory가 객체를 잘 생성하는지 확인한다.

fun main(args: Array<String>) {
    val man = HumanFactory.getHuman(ManFactory(20,"김철수"))
    val woman = HumanFactory.getHuman(WomanFactory(22,"김영희"))

    println(man.toString())
    println(woman.toString())
}


출력 :

Man - name : 김철수 , age : 20
Woman - name : 김영희 , age : 22