[디자인 패턴(Design Pattern)] 추상 팩토리(Abstract Factory)
카테고리: DesignPattern
태그: 디자인 패턴
추상 팩토리 패턴이란?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