diff --git a/src/main/kotlin/ru/otus/homework/builder.kt b/src/main/kotlin/ru/otus/homework/builder.kt new file mode 100644 index 0000000..61a7e11 --- /dev/null +++ b/src/main/kotlin/ru/otus/homework/builder.kt @@ -0,0 +1,45 @@ +package ru.otus.homework + +/** + * Паттерн Builder + */ + +class House( + private var floors: Int, + private var area: Double, + private var painting: Boolean?, + private var material: String? +) { + private constructor(builder: Builder) : this(builder.floors, builder.area, builder.painting, builder.material) + + companion object { + inline fun build(floors: Int, area: Double, otherParam: Builder.() -> Unit) = Builder(floors, area).apply(otherParam).build() + } + class Builder(var floors: Int, var area: Double) { + var painting: Boolean? = null + var material: String? = null + + fun build(): House { + return House(this) + } + } + + override fun toString(): String { + return """Ваш новый дом + Этажей: ${this.floors} + Площадь: ${this.area} + Покраска: ${this.painting} + Материал стен: ${this.material} + """ + } +} + +fun main() { + + val house1 = House.build(2, 200.0){} + println(house1) + + // вариант создания дома с доп параметрами + val house2 = House.build(1, 150.0) { material="кирпич"; painting=true } + println(house2) +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/homework/command.kt b/src/main/kotlin/ru/otus/homework/command.kt new file mode 100644 index 0000000..f067aac --- /dev/null +++ b/src/main/kotlin/ru/otus/homework/command.kt @@ -0,0 +1,73 @@ +package ru.otus.homework + +/** + * Паттерн Command + */ + +interface Command { + fun execute() +} + +class OpenCommand(val device: Device) : Command { + override fun execute() { + device.unlockDevice() + } +} +class LockAllCommand(val device: ArrayList) : Command { + override fun execute() { + device.forEach { it.lockDevice() } + } +} + + +interface Device { + fun unlockDevice() + fun lockDevice() +} + +class Safe : Device { + override fun unlockDevice() { + println("Сейф открыт") + } + + override fun lockDevice() { + println("Сейф закрыт") + } +} + + +class SmartDoor : Device { + override fun unlockDevice() { + println("Дверь разблокирована") + } + + override fun lockDevice() { + println("Дверь заблокирована") + } +} + +class Switcher(var c:Command) { + fun accept() { + c.execute() + } +} + +fun main() { + val safeDevice : Device = Safe() // сейф + val cmdOpenSafe = OpenCommand(safeDevice) + val switcherSafe = Switcher(cmdOpenSafe) + switcherSafe.accept() // откроем сейф + + val smartDoor : Device = SmartDoor() // умная дверь + val cmdOpenDoor = OpenCommand(smartDoor) + val switcherDoor = Switcher(cmdOpenDoor) + switcherDoor.accept() // откроем дверь + + // все сразу закроем + val allDevices = ArrayList() + allDevices.add(safeDevice) + allDevices.add(smartDoor) + val cmdAllLock = LockAllCommand(allDevices) + val switchAll = Switcher(cmdAllLock) + switchAll.accept() +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/homework/decorator.kt b/src/main/kotlin/ru/otus/homework/decorator.kt new file mode 100644 index 0000000..3144392 --- /dev/null +++ b/src/main/kotlin/ru/otus/homework/decorator.kt @@ -0,0 +1,67 @@ +package ru.otus.homework + +/** + * Паттерн Decorator на примере шиномнтажа)) + */ +interface TireService { + fun description(): String + fun cost(): Double +} + +class ChangeTire : TireService { + override fun description(): String { + return "Замена колеса (снять/поставить)" + } + + override fun cost(): Double { + return 1000.0 + } +} + +class RepairTire : TireService { + override fun description(): String { + return "Ремонт прокола шины" + } + + override fun cost(): Double { + return 300.0 + } +} + +abstract class DecoratorAddService(private val service: TireService) : TireService { + abstract override fun description(): String + + abstract override fun cost(): Double +} + +class Difficult(private val service: TireService) : DecoratorAddService(service) { + override fun description(): String { + return service.description() + ", высокая сложность работы" + } + + override fun cost(): Double { + return service.cost() + 500.0 + } +} + +class VipClient(private val service: TireService) : DecoratorAddService(service) { + override fun description(): String { + return service.description() + ", VIP" + } + + override fun cost(): Double { + return service.cost() + 1000.0 + } +} + +fun main() { + println("Шинка СУПЕР") + val changeTire : TireService = ChangeTire() // замена колес + println("${changeTire.description()} = ${changeTire.cost()}") + + var repairTire : TireService = RepairTire() // ремонт колес + repairTire = Difficult(repairTire) // + сложность + repairTire = VipClient(repairTire) // + vip обслуживание + + println("${repairTire.description()} = ${repairTire.cost()}") +} \ No newline at end of file diff --git a/src/main/kotlin/ru/otus/homework/singleton.kt b/src/main/kotlin/ru/otus/homework/singleton.kt new file mode 100644 index 0000000..123c899 --- /dev/null +++ b/src/main/kotlin/ru/otus/homework/singleton.kt @@ -0,0 +1,23 @@ +package ru.otus.homework + +/** + * Паттерн Singleton + */ +class Singleton private constructor() { + + companion object { + private var instance : Singleton? = null + fun getInstance(): Singleton { + if (instance == null) { + instance = Singleton() + } + return instance!! + } + } + +} + +fun main() { + // получим единственный экземпляр объекта + val single = Singleton.getInstance() +} \ No newline at end of file