0Pricing
Kotlin Academy · บทเรียน

เมธอด Factory ด้วย companion object

นำรูปแบบ factory ไปใช้ด้วย companion object และตัวดำเนินการ invoke

เมธอด Factory ด้วย companion object เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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())
        }
    }
}

โอเปอเรเตอร์ invoke ในฐานะโรงงานคล้ายตัวสร้าง

กำหนด invoke() เพื่อให้สามารถเรียกคลาสได้เหมือนฟังก์ชัน
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
        )
    }
}

เมื่อใดไม่ควรใช้ตัวสร้างส่วนตัว

อย่ากำหนดให้ตัวสร้างเป็นส่วนตัวเพียงเพื่อความสวยงามของรูปแบบ ควรใช้เมื่อจำเป็นต้องตรวจสอบความถูกต้อง ต้องใช้แคช หรือเส้นทางการสร้างหลายแบบมีความหมายแตกต่างกัน

ตรวจสอบอย่างรวดเร็ว

ฟังก์ชันโอเปอเรเตอร์ใดทำให้สามารถเรียกออบเจ็กต์คู่หูเหมือนตัวสร้างได้: Email("a@b.com")

สรุปทบทวน

เมธอดโรงงานในออบเจ็กต์คู่หูประกอบด้วยตัวสร้างส่วนตัวและโรงงานที่มีชื่อ การส่งคืนค่า null ที่เลือกใช้ได้ การแคช และ invoke() สำหรับไวยากรณ์ที่คล้ายตัวสร้าง โรงงานทำให้การสร้างออบเจ็กต์ปลอดภัย สื่อความหมาย และทดสอบได้

คำถามที่พบบ่อย

บทเรียน “เมธอด Factory ด้วย companion object” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เมธอด Factory ด้วย companion object” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เมธอด Factory ด้วย companion object”

นำรูปแบบ factory ไปใช้ด้วย companion object และตัวดำเนินการ invoke คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “เมธอด Factory ด้วย companion object” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การประกาศ object: Singleton ของ Kotlin
  2. companion object: สมาชิกคล้าย Static ใน Kotlin
  3. ออบเจ็กต์นิรนามและนิพจน์ออบเจ็กต์
  4. เมธอด Factory ด้วย companion object
← กลับไปที่ Kotlin Academy