Fungsi Factory
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan Lua di Coddy. Pelajaran 62 dari 70.
Sepanjang kursus ini, kamu telah membuat object dengan memanggil constructor secara langsung: Circle:new(), Rectangle:new(), dan seterusnya. Namun, bagaimana jika kamu ingin membuat berbagai jenis object berdasarkan suatu kondisi, tanpa kode pemanggil perlu mengetahui class tertentu yang harus digunakan?
Di sinilah pola Factory berperan. Factory hanyalah fungsi yang membuat dan mengembalikan object. Manfaat utamanya adalah pemanggil tidak perlu mengetahui detail pembuatan object. Pemanggil cukup meminta apa yang dibutuhkan kepada factory.
local function createShape(shapeType)
if shapeType == "circle" then
return Circle:new(10)
elseif shapeType == "square" then
return Square:new(5)
end
end
-- Pemanggil tidak perlu tahu tentang class Circle atau Square
local myShape = createShape("circle")
print(myShape:area())
Fungsi factory menerima argumen string dan menentukan class mana yang akan dibuat instansinya. Ini memusatkan logika pembuatan object di satu tempat. Jika nanti kamu menambahkan tipe bentuk baru, kamu hanya perlu mengubah factory, bukan setiap bagian kodemu yang membuat bentuk.
Factory sangat berguna ketika pembuatan object melibatkan penyiapan yang rumit, saat kamu ingin menyembunyikan detail implementasi, atau ketika tipe object yang tepat bergantung pada kondisi saat program berjalan, seperti input pengguna atau file konfigurasi.
Tantangan
MudahMari buat Pet Factory! Alih-alih membuat hewan peliharaan secara langsung dengan memanggil constructor setiap class, kamu akan membuat fungsi factory yang menghasilkan jenis hewan peliharaan yang tepat berdasarkan argumen string sederhana.
Kamu akan mengatur kodemu dalam empat file:
Dog.lua: Buat class Dog dengan constructor:new(name)yang menyimpan nama hewan peliharaan. Tambahkan method:speak()yang mengembalikan string"{name} says: Woof!"(dengan {name} sebagai nama anjing).Cat.lua: Buat class Cat dengan struktur yang sama: constructor:new(name)dan method:speak()yang mengembalikan"{name} says: Meow!".PetFactory.lua: Di sinilah pola Factory berperan! Buat fungsicreatePet(petType, name)yang menerima dua argumen: string yang menunjukkan jenis hewan peliharaan ("dog"atau"cat") dan nama hewan peliharaan. Fungsi ini harus mengembalikan object hewan peliharaan yang sesuai. Jika jenisnya"dog", kembalikan Dog baru; jika"cat", kembalikan Cat baru.main.lua: Muat module PetFactory-mu. Baca dua input: jenis hewan peliharaan dan namanya. Gunakan fungsi factory-mu untuk membuat hewan peliharaan, lalu panggil method:speak()dan cetak hasilnya.
Keunggulan pola Factory adalah kode utamamu tidak perlu memuat Dog atau Cat secara langsung. Kode tersebut hanya perlu mengetahui factory. Factory menangani semua detail tentang class mana yang akan dibuat sebagai instance.
Kamu akan menerima dua input:
- Jenis hewan peliharaan (antara
"dog"atau"cat") - Nama hewan peliharaan (sebuah string)
Misalnya, jika inputnya adalah dog dan Buddy, outputnya akan seperti berikut:
Buddy says: Woof!Jika inputnya adalah cat dan Whiskers, outputnya akan seperti berikut:
Whiskers says: Meow!Coba sendiri
-- main.lua
-- Gunakan PetFactory untuk membuat hewan peliharaan
local PetFactory = require('PetFactory')
-- Baca input
local petType = io.read()
local petName = io.read()
-- TODO: Gunakan PetFactory.createPet untuk membuat hewan peliharaan
-- TODO: Panggil method :speak() milik hewan peliharaan dan cetak hasilnya
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Konsep "Self"
Tabel dengan Fungsi'self' EksplisitSintaks Titik DuaTitik vs Titik DuaRangkuman, Titik Bergerak4Proyek: Bank Digital
Penyiapan Proyekmethod Setoran7Polimorfisme & Overriding
Menimpa methodMemanggil method indukDuck TypingAntarmuka UmumMemeriksa TipeRingkasan: Peran Karyawan10Proyek: Pengelola Bentuk
Penyiapan Proyekclass Rectangleclass Circlemethod KelilingKumpulan BentukLuas TotalSaring Bentuk2Pola Prototype untuk class
Konsep PrototypeMenghubungkan dengan __indexKonstruktor :new()Menginisialisasi AtributInstans yang MandiriRangkuman: Pabrik Mobil5Pembebanan Operator dalam OOP
Menjumlahkan ObjekMengurangkan ObjekMenggabungkan ObjekMembandingkan Objek (<, >)Ulasan: Aritmetika Dompet8Enkapsulasi
Konvensi PenamaanClosure untuk PrivasiAkses melalui ClosureTabel Hanya-BacaLogika ValidasiRangkuman: Brankas Aman11Pola Desain (Ringan)
Fungsi FactoryTabel SingletonPola IteratorObserver (Listener)Rangkuman, Factory Logger3State dan Behavior pada object
Variabel InstansGetter methodSetter methodProperty TerhitungMemformat stringPemeriksaan KesetaraanRangkuman: Nilai Siswa6Dasar-Dasar Pewarisan
Menyiapkan PewarisanMewarisi methodMemperluas KonstruktorMenambahkan method untuk ChildSama vs UnikRangkuman: Hierarki BentukLatihan sendiri: Compiler Lua online