본문 바로가기
2023년 이전/디자인 패턴

디자인 패턴 - 팩토리 매서드 패턴 (Factory Method Pattern)

by JeongUPark 2019. 11. 20.
반응형

팩토리 매서드 패턴이란 객체 생성을 서브클래스로 분리하여 처리하도록 캡슐화 하는 패턴을 말합니다.

각각의 역할은 

Product - 팩토리 메서드로 생성될 객체

Creator - 팩토리 메서드를 갖는 클래스

ConcreteCreator - 팩토리 메서드를 구현하는 클래스

입니다. 이 패턴의 핵심은 객체 생성을 전담하는 Fractory Method가 존재하는 점 입니다.

자세한 이해는 예제 code를 보면서 다시 설명하겠습니다.

tony가 iron man을 만듭니다.

 

우선 생서될 객체 Product를 만듭니다.

abstract class IronMan{
    var version : String? = null
    var ability : String? = null
    var power : Int? = null
    var usage : String? = null

    fun prepare(){
        println("version: $version")
        println("ability: $ability")
        println("power: $power")
        println("usage: $usage")
    }

    open fun make(){
        println("Making IronMan $version")
    }

}
class Mark_1  : IronMan(){
    init {
        ability = "fire attck"
        power = 1000
        usage = "first version"
        version = "Mark-1"
    }
}
class Mark_2  : IronMan(){
    init {
        ability = "fly"
        power = 2000
        usage = "Orignal Test version"
        version = "Mark-2"
    }

    override fun make(){
        println("make $version, this version need more time")
    }
}

그 후 조건에 따란 product를 생성할 Creator를 만듭니다.

class IronMannFactory {
    fun createIron(type:String) : IronMan{
        lateinit var ironMan : IronMan
        when(type){
           "Mark-1" ->{ironMan = Mark_1()}
            "Mark-2" ->{ironMan = Mark_2()}
        }
        return ironMan
    }
}

 

 

그리고 ConcreteCreator를 가지는 실행 code를 만들어서 실행하면

fun main(){

    val factory = IronMannFactory();

    var iron_1 = factory.createIron("Mark-1")
    var iron_2 = factory.createIron("Mark-2")

    iron_1.prepare()
    iron_1.make()

    iron_2.prepare()
    iron_2.make()


}

그 결과는

version: Mark-1
ability: fire attck
power: 1000
usage: first version
Making IronMan Mark-1
version: Mark-2
ability: fly
power: 2000
usage: Orignal Test version
make Mark-2, this version need more time

이렇게 나옵니다.

결론적으로 팩토리 메서드 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위한것입니다. 결합도라는 것은 간단히 말해 클래스의 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가입니다. 팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거합니다. 결과적으로 결합도 또한 낮출 수 있습니다.

 

그리고 인스턴스 객체 생성 시 싱글턴 방식을 사용하여 한개의 객체로 사용할 수 도 있습니다. (아래와 같은 방식을 사용하면 됩니다.)

class Mark_1  : IronMan(){
    companion object{
        var mark_1 : Mark_1 = Mark_1()
        fun getInstance() : Mark_1{
            return mark_1
        }
    }
    init {
        ability = "fire attck"
        power = 1000
        usage = "first version"
        version = "Mark-1"
    }


}

 

참고

https://ko.wikipedia.org/wiki/%ED%8C%A9%ED%86%A0%EB%A6%AC_%EB%A9%94%EC%84%9C%EB%93%9C_%ED%8C%A8%ED%84%B4

https://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html

https://jusungpark.tistory.com/14?category=630296

https://jdm.kr/blog/180

 

 

반응형