Kotlin Academy · Урок

Фабричные методы с companion object

Реализуйте фабричные шаблоны с помощью companion object и оператора invoke.

Урок 4 из 413 шагов

«Фабричные методы с companion object» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.

Шаблон фабричного метода

Фабричные методы создают объекты с понятными именами и логикой, скрывая сложность конструктора. Сопутствующий объект Kotlin — идеальное место для них.

Приватный конструктор и фабрика

Сделайте конструктор приватным и предоставьте фабричные методы через сопутствующий объект.
class Token private constructor(val value: String) {
    companion object {
        fun generate() = Token(java.util.UUID.randomUUID().toString())
        fun fromString(s: String) = Token(s.trim())
    }
}
val t = Token.generate()

Именованные фабричные методы

Описательные имена ясно передают назначение, в отличие от перегрузок конструктора.
class Duration private constructor(val ms: Long) {
    companion object {
        fun ofMillis(ms: Long) = Duration(ms)
        fun ofSeconds(s: Long) = Duration(s * 1000)
        fun ofMinutes(m: Long) = Duration(m * 60_000)
    }
}
val d = Duration.ofMinutes(5)

Возврат null из фабрики

Фабрики могут возвращать null для недопустимых входных данных вместо выбрасывания исключения.
class Percentage private constructor(val value: Int) {
    companion object {
        fun of(value: Int): Percentage? {
            return if (value in 0..100) Percentage(value) else null
        }
    }
}
val p = Percentage.of(75) ?: error("Invalid")

Кэшируемые экземпляры

Фабрики могут кэшировать экземпляры и повторно использовать их.
class Direction private constructor(val name: String) {
    companion object {
        private val cache = mutableMapOf<String, Direction>()
        fun of(name: String) = cache.getOrPut(name.uppercase()) {
            Direction(name.uppercase())
        }
    }
}

Оператор вызова как фабрика в стиле конструктора

Определите функцию вызова, чтобы вызывать класс как функцию.
class Email private constructor(val address: String) {
    companion object {
        operator fun invoke(raw: String): Email {
            require("@" in raw) { "Invalid email" }
            return Email(raw.lowercase())
        }
    }
}
val e = Email("Test@Example.com")  // looks like a constructor

Абстрактная фабрика с запечатанными классами

Объединяйте фабричные методы с иерархиями запечатанных классов для типобезопасного создания объектов.
sealed class Shape {
    data class Circle(val r: Double) : Shape()
    data class Rect(val w: Double, val h: Double) : Shape()
    companion object {
        fun circle(r: Double) = Circle(r)
        fun rect(w: Double, h: Double) = Rect(w, h)
    }
}

Фабрика с учётом зависимостей

Фабрики могут принимать зависимости и связывать их между собой.
class Repository(private val db: Database) {
    companion object {
        fun create(db: Database = Database.instance) = Repository(db)
    }
    fun findAll() = db.query("SELECT * FROM items")
}

Фабрика в тестах

Фабричные методы делают создание тестовых объектов понятным и явным.
class Order private constructor(
    val id: Long, val items: List<String>, val paid: Boolean
) {
    companion object {
        fun unpaid(id: Long, items: List<String>) = Order(id, items, false)
        fun paid(id: Long, items: List<String>) = Order(id, items, true)
    }
}

Из JSON и конфигурации

Фабрики естественным образом подходят для разбора данных.
class AppConfig private constructor(
    val baseUrl: String, val timeout: Int
) {
    companion object {
        fun fromEnv() = AppConfig(
            baseUrl = System.getenv("BASE_URL") ?: "http://localhost",
            timeout = System.getenv("TIMEOUT")?.toInt() ?: 30
        )
    }
}

Когда NOT следует использовать приватный конструктор

Не делайте конструкторы приватными только ради стиля. Используйте такой подход, когда необходима проверка данных, требуется кэширование или разные пути создания имеют различный смысл.

Быстрая проверка

Какая функция-оператор позволяет вызывать сопутствующий объект как конструктор: Email("a@b.com")?

Итоги

Фабричные методы в сопутствующих объектах: приватный конструктор и именованные фабрики, необязательный возврат null, кэширование и оператор вызова для синтаксиса, похожего на конструктор. Фабрики делают создание объектов безопасным, выразительным и удобным для тестирования!
Можно начать бесплатно

Изучай Kotlin с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Фабричные методы с companion object» бесплатный?

Да — полный текст урока «Фабричные методы с companion object» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.

Чему я научусь в уроке «Фабричные методы с companion object»?

Реализуйте фабричные шаблоны с помощью companion object и оператора invoke. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Kotlin Academy?

Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Фабричные методы с companion object»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Kotlin Academy?

Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Объявление object: синглтоны Kotlin
  2. companion object: статические элементы в Kotlin
  3. Анонимные объекты и объектные выражения
  4. Фабричные методы с companion object
← Назад к Kotlin Academy