[kotlin] 코틀린 디자인 패턴 예제 코드

코틀린 디자인 패턴: 예제 코드

디자인 패턴은 소프트웨어 개발에서 자주 사용되는 구조적인 해결책을 제시합니다. 쉽고 재사용 가능한 코드를 작성하기 위해 디자인 패턴을 적용하는 것이 중요합니다. 여기에서 몇 가지 코틀린으로 작성된 디자인 패턴 예제 코드를 살펴보겠습니다.

1. 싱글턴 패턴

싱글턴 패턴은 어떤 클래스가 최대 한 번만 인스턴스화되도록 보장하는 패턴입니다. 코틀린에서 싱글턴 패턴을 구현하는 방법은 다음과 같습니다.

object Singleton {
    init {
        println("Singleton 인스턴스가 생성되었습니다.")
    }

    fun doSomething() {
        println("작업을 수행합니다.")
    }
}

fun main() {
    Singleton.doSomething()
}

2. 팩토리 메서드 패턴

팩토리 메서드 패턴은 객체를 생성하기 위한 인터페이스를 정의하고, 인스턴스화할 클래스의 결정은 서브클래스에서 이루어지도록 하는 패턴입니다. 코틀린에서 팩토리 메서드 패턴을 구현하는 방법은 다음과 같습니다.

interface Product {
    fun operation()
}

class ConcreteProductA : Product {
    override fun operation() {
        println("제품 A의 동작을 수행합니다.")
    }
}

class ConcreteProductB : Product {
    override fun operation() {
        println("제품 B의 동작을 수행합니다.")
    }
}

abstract class Creator {
    abstract fun factoryMethod(): Product

    fun someOperation() {
        val product = factoryMethod()
        product.operation()
    }
}

class ConcreteCreatorA : Creator() {
    override fun factoryMethod(): Product {
        return ConcreteProductA()
    }
}

class ConcreteCreatorB : Creator() {
    override fun factoryMethod(): Product {
        return ConcreteProductB()
    }
}

fun main() {
    val creatorA = ConcreteCreatorA()
    creatorA.someOperation()
  
    val creatorB = ConcreteCreatorB()
    creatorB.someOperation()
}

3. 옵서버 패턴

옵서버 패턴은 객체 사이에 일대다 종속성을 정의하며, 어떤 객체의 상태가 바뀌면 그 객체에 종속된 모든 객체들에게 자동으로 알림을 전달하는 패턴입니다. 코틀린에서 옵서버 패턴을 구현하는 방법은 다음과 같습니다.

interface Observer {
    fun update(message: String)
}

class ConcreteObserverA : Observer {
    override fun update(message: String) {
        println("Observer A가 업데이트를 받았습니다: $message")
    }
}

class ConcreteObserverB : Observer {
    override fun update(message: String) {
        println("Observer B가 업데이트를 받았습니다: $message")
    }
}

class Subject {
    private val observers = mutableListOf<Observer>()

    fun attach(observer: Observer) {
        observers.add(observer)
    }

    fun detach(observer: Observer) {
        observers.remove(observer)
    }

    fun notify(message: String) {
        for (observer in observers) {
            observer.update(message)
        }
    }
}

fun main() {
    val subject = Subject()
    val observerA = ConcreteObserverA()
    val observerB = ConcreteObserverB()

    subject.attach(observerA)
    subject.attach(observerB)

    subject.notify("알림 메시지")
}

위의 예제 코드를 참고하여, 다양한 디자인 패턴을 코틀린으로 구현할 수 있습니다. ```