팩토리 매서드 패턴이란 객체 생성을 서브클래스로 분리하여 처리하도록 캡슐화 하는 패턴을 말합니다.
각각의 역할은
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://gmlwjd9405.github.io/2018/08/08/abstract-factory-pattern.html
https://jusungpark.tistory.com/14?category=630296
'2023년 이전 > 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - 추상 팩토리 패턴(Abstract Factory Pattern) (0) | 2019.11.20 |
---|---|
디자인 패턴 - 컴퍼지트 패턴 (Composite Pattern) (0) | 2019.11.19 |
디자인 패턴 - 데코레이터 패턴(Decorator Pattern) (0) | 2019.11.18 |
디자인 패터 - 옵저버 패턴(Observer Pattern) (0) | 2019.11.18 |
디자인 패턴 - 커맨드 패턴(Command Pattern) (0) | 2019.11.15 |